其他
Go 最新资讯:Go 1.16 正式发布,支持 macOS ARM64 架构
大纲
多平台指令的支持
Darwin and iOS
NetBSD
OpenBSD
386
RISC-V
工具链
Go Command
Cgo
Vet
运行时
编译器
链接器
标准库
总结
Go 1.16 release 版本今天正式发布。距离上个 Go 1.15 版本差不多 6 个月,所以这个版本迭代速度还是挺快的。本次更新没有对语言本身做变更,主要更新的是工具链,运行时( runtime ),标准库的一些功能实现和性能。Go 1.16 版本保持 Go 1 版本兼容性 的承诺。
相关地址:
更新公告地址:https://golang.org/doc/go1.16 版本下载地址:https://golang.org/dl/
更新命令:
$ 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 芯片指令集;
darwin/arm64
改名为 ios/arm64
;ios/amd64
的类型;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 指令集做了部分的优化。
工具链
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;
往期推荐
往期推荐
坚持思考,方向比努力更重要。关注我:奇伢云存储