更多干货:关注公众号奇伢云存储linux
[toc]ios
Go 1.16 距离上个 Go 1.15 版本差很少 6 个月,因此这个版本迭代速度仍是挺快的。本次更新没有对语言自己作变动,主要更新的是工具链,运行时( runtime ),标准库的一些功能实现和性能。Go 1.16 版本保持 Go 1 版本兼容性 的承诺。golang
相关地址:安全
更新命令:markdown
$ go get golang.org/dl/go1.16
$ go1.16 download
复制代码
多平台指令的支持
Darwin and iOS
- Go 1.16 支持 64 位 ARM 架构上的 macOS 操做系统 (Apple Silicon),使用方式经过
GOOS=darwin,GOARCH=arm64
;
- 也就是 Apple 发布的最新的 M1 芯片指令集;
- 至于以前 iOS 平台上的,则由
darwin/arm64
更名为 ios/arm64
;
- Go 1.16 添加
ios/amd64
的类型;
- Go 1.16 运行至少须要的系统版本 >= macOS 10.12 Sierra;
NetBSD
Go 1.16 在 NetBSD(netbsd/arm64
)上支持 64 位 ARM 体系架构。架构
OpenBSD
Go 1.16 在 OpenBSD(openbsd/mips64
)上支持 MIPS64 体系架构,不支持 cgo。函数
386
Go 1.16 放弃了对 x87 模式编译(GO386=387
)的支持。如今使用软浮动模式(GO386=softfloat
)支持非 SSE2 处理器。在非 SSE2 处理器上运行的用户应替换GO386=387 为GO386=softfloat
。工具
RISC-V
Go 1.16 在 linux/riscv64
如今支持 cgo 和 -buildmode=pie 。Go 1.16 对 RISC-V 指令集作了部分的优化。oop
工具链
Go Command
- module-aware 模式成为默认状态。
- 支持使用
//go:embed
指令来将静态文件和文件树做为可执行文件的一部分直接内嵌包含在里面。
Cgo
- cgo tool 再也不翻译 C 语言里的位域字段( C struct bitfields )对应到 Go 的结构体字段了(这一点要很是注意了,在使用 Cgo 的时候,这里没注意到的话,就会致使严重的 bug)。
Vet
- 新增对无效测试场景的告警,好比单测某些场景对 Fatal 的无效调用;
- 新增对 frame pointer 的告警,这个主要是针对一些汇编代码,破坏了对 bp 寄存器的使用约定,Go 1.16 将会对这种检测出来并告警;
- 新增
asn1.Unmarshal
的警告,好比传递非指针对象或者 nil 值;
运行时
- 新增 runtime/metrics 包的功能,替代runtime.ReadMemStats 和 debug.ReadGCStats,runtime/metrics 包更通用、稳定、高效;
GODEBUG
环境变量支持跟踪:GODEBUG
环境变量包含inittrace=1
时,Go 运行时将会 trace 输出 package 的 init 函数的执行时间和一些内存分配消耗状况;
编译器
- 对内联的复杂场景的识别和优化,好比 Go 1.16 能够内联具备未标记 for 循环,方法值和类型判断的函数。
连接器
- 进一步优化连接阶段的性能,减小了连接程序资源的使用(时间和内存),并提升了代码的健壮性/可维护性。Go 1.16 连接平均比Go 1.15 的快20%-25%,消耗的内存减小 5%-15%(
linux/amd64
平台数据)。
标准库
- 新
io/fs
package 定义了fs.FS
接口,它是文件只读树的抽象;
- 弃用
io/ioutil
,存量功能迁出到其余具体的 package。好比 Discard => io.Discard
,TempDir => os.MkdirTemp
等等。其实主要是迁入到 io 和 os 这两个 package;
- 对 Unicode 标准的支持从 12.0.0 升级为 13.0.0;
- net 标准库的实现中,在 Linux 上,在缺失 /etc/hosts 时,主机名查找再也不使用 DNS /etc/nsswitch.conf。这个作法常见于基于 Musl 的系统,并使得 Go 程序与这些系统上 C 程序的行为相一致;
总结
- Go 1.16 主要是 bugfix 和稳定性的提高,并无重大的特性变化;
- Go 1.16 对多平台多指令架构作了更好的兼容,特别是对 2020 年 Apple 发布的 M1 芯片;
- Cgo tool 再也不对 C 的位域作转换,这里要注意;
- Vet 新增了一些告警检测,让咱们的语法检查更全面和安全;
- 连接阶段进一步提升了性能,连接速度更快而且耗费资源更少;
- Go 1.16 支持了静态资源文件的内嵌;
- 标准库 io/util 废弃,存量功能迁移到语义更明确的包,比 io 和 os ;
- 标准库 net 对于域名解析的行为和 musl-based 的系统一直;
- Unicode 支持升级为 13.0.0;
更多干货:关注公众号奇伢云存储性能