Pi*R^2

golang 1.13

字数统计: 1.3k阅读时长: 5 min
2019/09/19 Share

2019.09.03, golang 发布了新版本,一起来学习下本次修改的内容。

二进制数字标识

使用 0b 或者 0B 标识二进制数字。 例如: 0b1011 标识11

八进制数字标识

使用 0o 或者 0O 标识8 进制整数。例如: 0o660, 目前使用的包含前导0的数字仍旧是合法的。

十六进制浮点数标识

使用 0x 或者 0X 是使用十六进制标识浮点数。其中指数是在p标识后面,是2的指数倍。例如 0x1.0p-1021 ,代表 2 ^ -1021 次方

虚数的数字标识

虚数虚部的标识已支持已有的所有表达方式,例如:

0i
0123i // == 123i for backward-compatibility
0o123i // == 0o123 * 1i == 83i
0xabci // == 0xabc * 1i == 2748i
0.i
2.71828i
1.e+0i
6.67428e-11i
1E6i
.25i
.12345E+5i
0x1p-2i // == 0x1p-2 * 1i == 0.25i

数字分割符

按照国外按下划线分为多个组, 下划线可以出现在仍以两个数字或者数字前缀和首个数字之间如: 1_000_000, 0b_1010_0110, 3.1415_9265

移位运算符不再需要uint 变量

减少了不必要的uint 操作

工具的修改

golang 自带了很多工具命令,每次版本更迭时,可能会做相关工具的更新。

module

  • GO111MODULE 环境继续默认值为auto, 但是auto 默认无论当前目录或者子目录包含go.mod 文件(即使当前目录在GOPATH/src 目录下)均认为开启gomodule。这个修改将简化现有使用GOPATH 的代码和使用gomodule但使用方是使用GOPATH的代码维护。
  • 新增GOPRIVATE 环境变量, 用于标识非共有仓库的数据源
  • 设置GOPROXY 控制代理
  • GOSUMDB 环境变量标识, 用于验证包的有效性的地址 , 默认为 sum.golang.org/lookup/xxx, 关闭方式 “go env -w GOSUMDB=off”
  • 修改后, go get -u 仅下载当前目录下的依赖包,如果更新所有的依赖包,需要使用 go get -u all
  • go get 不再支持 -m.

Go Command

  • go env -w / -u 设置或者删除用户的环境变量值, 环境变量值将被存在 os.UserConfigDir()
  • go version [-m] [-v] [file ...] 若指定了file,则打印响应可执行文件的所使用的go版本, 若使用 -m , 打印嵌入没款的版本信息。如果是一个目录,将打印目录包含的可执行文件的信息和相关子目录的可执行文件的go编译版本。
  • go build flag 变更
    • -trimpath 移除所有编译自带的文件系统链接路径,减少编译依赖。 (这个对于服务跨版本迁移相当有帮助)
    • -o 如果传入的是一个已存在的目录,go build 生成的可执行文件将写入此目录中。
    • -tags 建议使用逗号分割编译标识符,当然空格也在维护,但已经标识为即将废弃

Compiler toolchain

  • 编译器做了优化,对于逃逸分析更加精准。当然如果需要做回归分析,可以使用 -gcflags=all=-newscape=false 做老的逃逸分析。

Assembler

在 ARM v8.1 上增加了多个原子指令

gofmt

主要对于 数字样式变更的修改。

godoc

godoc 不再在golang 包中出现,需要通过 go get golang.org/x/tools/cmd/godoc 安装

runtime

  • defer 性能提升 30%

Core Library

  • TLS 1.3 支持。 在crypt/tls 包中,默认支持 TLS 1.3
  • crypto/ed25519 golang.org/x/crypt/ed25519包迁移至 crypto/ed25519 中。该包是 Ed25519 数字签名算法的实现。
  • Error wrapping golang 支持错误包装。
    • 一个错误 e 可以包含另外一个错误w. e 通过调用 Unwrap 方法可以拿到错误w
    • fmt.Errorf 可以通过 %w 创建一个wrapped 错误
    • errors 包提供了 errors.Unwrap, errors.Is errors.As 三个方法用于错误包含的判定。
  • 其他类库的小修改
    • bytes.ToValidUTF8() 方法。 替换不合法的u8 编码为指定的字符。
    • `context
    • crypto/tls包中,sslv3 再1.13 标记为即将废弃,在 go1.14 将被移除
    • crypto/x509
    • database/sql NullTime 类型代表可能为null 的time.Time;NullInt32 代表 可能为null 的 int32 类型
    • debug/dwarf
    • errors 添加 As, Is, UnWrap 方法
    • fmt
      • “%x %X” 支持 浮点数和复数的16进制格式化
      • “%0” 输出带有前导0o的8进制数
      • Errorf 添加 “%w”, 用于生成错误包装函数
    • go/scanner
    • go/types
    • html/template
    • log
    • math/big
      • Rat 增加了函数 Rat.SetUint64(), Rat.SetString 支持非十进制浮点数表达
    • net
    • net/http
    • os
      • 新的UserConfigDir 方法返回用户配置目录的根目录
      • 如果File 通过 O_APPEND 标识打开, WriteAt 方法不可用,将返回错误。
    • os/exec
      • windows 中,Cmd 的环境变量线性继承自 %SYSTEMROOT% 的值,除非Cmd.Env 显性赋值。
    • reflect
      • 新增 Value.IsZero 方法,判断是否为0值
      • MakeFunc 允许在返回值的类型上做复制转换。有利于那种定义了抽象返回类型,而实现是一个具体返回值的方法调用
    • runtime
    • strconv
    • strings
    • sync
      • 通过编译优化,将 Mutex.Lock, Mutex.Unlock, RWMutex.Lock, RWMutex.RUnlock, Once.Do 编译优化inlining 化。对于amd64上无竞争的互斥量, Once.Do 快了一倍, Mutex/RWMutex 快10%
    • syncall
    • syscall/js
    • testing
    • text/scanner
    • text/template
    • time
    • unicode

go 1.13 release note

原文作者:lpflpf

原文链接:http://blog.lpflpf.cn/passages/golang-1.13/

发表日期:2019-09-19 15:15:00

更新日期:2019-09-25 12:17:38

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG
  1. 1. 二进制数字标识
  2. 2. 八进制数字标识
  3. 3. 十六进制浮点数标识
  4. 4. 虚数的数字标识
  5. 5. 数字分割符
  6. 6. 移位运算符不再需要uint 变量
  7. 7. 工具的修改
    1. 7.1. module
    2. 7.2. Go Command
    3. 7.3. Compiler toolchain
    4. 7.4. Assembler
    5. 7.5. gofmt
    6. 7.6. godoc
  8. 8. runtime
  9. 9. Core Library