Go 1.13 前瞻
对 Golang 感兴趣的同学欢迎关注公众号:golang-experts
Go 1.13 预计会在 2019 年的八月发布,这篇文章来来一个预览。Release Note 链接:Go 1.13 Release Notes
1. 语言 spec 方面改动
主要集中在这个 Proposal: golang/proposal ,主要是一些数字的表示方面,包括:
- 使用 0b/0B 开头来表征二进制数
- 使用 0o/0O (前面是数字零,后面的是字母 o)来表征八进制
- 使用 0x/0X 开头来表征十六进制数
- 使用 i 来表征复数
- 可使用下划线 _ 来作为数字分隔
右移位操作的 unsign 限制移除,Proposal: golang/proposal
2. 跨平台支持
- AIX: aix 平台支持 cgo
- Android: 兼容 Android Q
- Darwin: Go 1.13 支持需要macOS 版本 10.11 El Capitan 及以上
- FreeBSD: FreeBSD 11.2 及以上
- Illumos: 编译选项
GOOS=illumos
支持 - NetBSD: 支持 NetBSD on ARM64
- OpenBSD: 支持 OpenBSD on ARM64
- Windows: 底层要求 Windows 7
3. Tool
1. Module
主要是包管理 go module 的加强,比如环境变量,proxy 等。
2. Command
- go env 支持 -w 参数为用户单独设置环境变量,-u 参数取消设置
- go version 可以查看二进制文件的编译 go 版本
- go build 的参数 trimpath 可以二进制文件中的文件系统路径以提高 build 效率;-tags 支持多个编译选项
- go generate 增加 generate build 选项
3. Compiler Toolchain
主要改进在逃逸分析上更加准确。逃逸分析是说 Go 的编译器来决定我们程序中的变量是分配到栈上还是堆上,更准确的意思是之前有些被误分配到堆的变量能够更准确的分配到栈上。因为函数栈帧上的变量会随着函数调用结束而释放,所以这可能会导致之前运行 OK 的程序出错(比如使用 unsafe 包导致之前误诊断,这也是一个不要使用 unsafe 包的原因)。
如果要保持之前的行为可以设置变量:gobuild-gcflags=all=-newescape=false
4. Assembler
支持 ARM v8.1 引入的原子指令。
5. Gofmt
支持格式化前面说到的数字格式。比如 0B1010
,0XabcDEF
,0O660
,1.2E3
, and01i
经过 fmt 之后得到0b1010
,0xabcDEF
,0o660
,1.2e3
, and1i
。
6. godoc
从主包中移除,如果要使用,需要单独安装
go get golang.org/x/tools/cmd/godoc
godoc
4. Runtime
Out of range 的 panic 信息会包含 index 和 cap 的信息。
Defer 的性能提升 30%,defer 的性能损耗可以参考之前的一篇源码分析:尼不要逗了:深入理解 Go 语言 defer
Runtime 归还给 OS 的内存策略会更激进(原文是 aggressive,我理解这里的激进的意思大概是有空闲的就还给你,相比之前会保留一段时间)。但是由于很多操作系统对内存的回收都是惰性的,所以 Runtime 这个地方的改变可能并不会导致进程的实际使用的物理内存显著减少,除非系统内存不足,主动回收。
5. 核心代码库
package crypto/ed25519 实现了之前在 package golang.org/x/crypto/ed25519 中实现的Ed25519 算法。
其他都是微小的改动,可以参考原文链接。
总的来说,改动较小,乏善可陈。
6. 参考
打个广告,欢迎关注公众号:golang-experts