新的官方网站
新的网站集合了golang.org 以及相关网站上的内容(如下载说明、文档、教程、官方博客、playground 等),力求把诸多分散的 Go 官方内容统一起来,并且 国内可以直接访问 。
模块管理
默认启用go modules
在 Go 语言的 1.16 版本中把 GO111MODULE 默认值设置为了 on 。这标志着 go module 机制的成熟。同时,这也说明 Go 团队已开始正式普及 go module 机制。在 go 语言的 1.16 版本中把 GO111MODULE 的默认值设置为了 on 。这标志着 go module 机制的成熟。同时,这也说明 Go 团队已开始正式普及 go module 机制。如果还没有开始用go mod,那么应该开始使用了,官方早就给了迁移步骤Migrating to Go Modules。
启用go module后,我们就有了一个从模块到代码包(以及子代码包)再到源码文件的多级代码组织方案。其中,源码文件是代码编译的最小单元,代码包是代码组织的最小单元,而模块则是代码发布的最小单元。
go命令变化
1.16中对go install和go get以及其他go命令做了一定的能力划分
go install // 下载编译安装
go get // 下载依赖并更新go.mod
go build // build,不再下载依赖和更新go.mod
go test // test,不再下载依赖和更新go.mod
go mod // 依然是原来的能力
1.16 版本的 Go 语言还废弃 go get 命令对 -insecure 标记的支持
1.17版本对go.mod做了一定修改,支持修剪模块图能力,如果主模块的 go.mod 文件声明的 Go 版本是 1.17 或更高,那么 go mod 命令就会在该文件中记录主模块的所有直接依赖模块和间接依赖模块。如此一来,其他的 go 命令就可以直接去查找在这里记录的那些模块了。为了让大家更加平滑地更新 go.mod 文件,go mod tidy 命令添加了对 -go 标记(即 flag)的支持。
go mod tidy -go=1.17
标准库
1.16 版本中引入io/fs 包和 embed 包,废弃 io/ioutil 包
- io/ioutil.Discard 的功能已移至 io.Discard;
- io/ioutil.NopCloser 的功能已移至 io.NopCloser;
- io/ioutil. ReadAll 的功能已移至 io.ReadAll
- io/ioutil.ReadDir 的功能已移至 os.ReadDir(但要注意,两者返回的第一个结果值的类型不同,前者是 []fs. File Info,而后者是 []os.DirEntry);
- io/ioutil.ReadFile 的功能已移至 os.ReadFile;
- io/ioutil.TempDir 的功能已移至 os.MkdirTemp;
- io/ioutil.TempFile 的功能已移至 os.CreateTemp;
- io/ioutil. WriteFile 的功能已移至 os.WriteFile 。
1.17 版本中增加支持从切片到 数组指针 的转换
s1 := []int{0, 1, 2, 3}
arr1 := (*[4]int)(s1)
注意如果我们给定的数组指针类型不恰当,那么这里的第二行代码就会立即抛出一个运行时异常(即 panic)
性能
在 1.16 版本中,Go 语言的链接器在性能方面得到了进一步的提升。在 64 位的 linux 操作系统上,其链接速度比 1.15 版本快了 20%-25%,同时链接操作所占用的内存空间也减少了 5%-15%。在其他的计算平台上,此类性能提升有过之而无不及。
在 1.17 版本中,Go 团队实现了一种使用 寄存器 而不是堆栈来传递函数参数值和结果值得新方法。让 Go 程序的运行性能提升了大约 5%。并且,Go 程序产出的二进制文件通常也会小 2% 左右。目前,在 Linux、 macOS 和 Windows 操作系统的 64 位计算结构上,Go 语言都自动启用了此功能。
ARM64架构支持完备
新支持 darwin /arm64和windwos/arm64,(linux/arm64早就支持)至此,主流系统的arm64都已经支持。