Go1.16新特性

go1.16 feature

Posted by alovn on February 17, 2021

Go1.15发布6个月后, Golang又发布了1.16版本。这次版本更新最主要的变化是在工具链、runtime和一些库的实现上。

支持arm64, 可以在M1芯片的新Mac上尝试使用Golang了。

go modules新特性

1.16开始默认启用modules, GO111MODULE 现在开始默认值为on。如果不习惯可以改回auto, 不过1.17版本这个环境变量将会被移除。

go build 、go test 等涉及编译的命令默认不会再更改 go.mod和 go.sum 文件,效果相当于之前版本中加入的 -mod=readonly 参数。模块依赖管理可以使用go mod tidy 或 go get。

go install 支持指定版本后缀的参数,例如 go install example.com/[email protected]

go install将是推荐的编译安装包的命令,go get 应该与 -d 参数一起使用(即只下载不安装)调整当前模块的依赖包,未来的版本中-d参数将会始终启用,也就是说编译和安装的功能会从go get命令中移除。go get 和 go install 开始各司其职。

新增GOVCS环境变量,指定了golang 是用什么版本控制工具下载源码的, bzr、fossil、git、hg、svn 等。格式为:GOVCS=<module prefix>:<tool name>,… 多个用逗号分割。 module prefix也可以用*通配任何模块的前缀。 tool name还可以设置为all和off,all代表允许使用任何可用的工具,而off则表示不允许使用任何版本控制工具。。

1
2
3
GOVCS=github.com:git,evil.com:off,*:git|hg
GOVCS=*:all //支持所有版本控制工具
GOVCS=*:off //禁用所有版本控制工具

相对路径导入不再被允许

标准库的变化

testing包最大的变化是os.Exit(0)会从程序终止变成测试失败。

ioutils包已被标记为废弃,函数被转移到了 os 和 io 两个包里,具体如下:

1
2
3
4
5
6
7
8
Discard => io.Discard
NopCloser => io.NopCloser
ReadAll => io.ReadAll
ReadDir => os.ReadDir//返回os.DirEntry slice, 而不是fs.FileInfo slice)
ReadFile => os.ReadFile
TempDir => os.MkdirTemp
TempFile => os.CreateTemp
WriteFile => os.WriteFile

io/ioutil 依然存在, 只是变更了内部函数调用, 推荐使用新定义的包。

新增 embed 包,支持嵌入静态资源。在此之前可以使用 go-bindata 等第三方库进行资源嵌入,现在可以替换为embed标准库了。

1
2
3
4
5
import _ "embed"

//go:embed hello.txt
var s string
print(s)

代码中使用//go:embed 指令, 可以使编译时读取当前目录下的hello.txt文件, 变量s就会输出hello.txt文件中的内容。

新的 io/fs 包定义了 fs.FS 接口, embed 嵌入资源也是依赖 FS 实现的, embed.FS 实现了 fs.FS接口。

增加了 runtime/metrics 包

unicode 更新到 13.0.0

参考

以上只列出了变更的一部分,完整的更新变化请查看官方文档,官方文档始终是最好的说明书。

  1. go1.16 released
  2. golang.org/pkg/embed