Go 1.5 (2015-08-19)
Go 1.5 于 2015 年 8 月发布,这是一个具有里程碑意义的版本。在此版本中,Go 编译器和运行时完全用 Go 语言重写(实现了自举),并引入了全新的并发垃圾回收器。
主要变化
语言
-
Map 字面量简化: 当 Map 的键或值类型已知时,可以在字面量中省略类型名称。
// Go 1.5 之前
m := map[Point]string{
Point{29.935523, 52.891566}: "Persepolis",
}
// Go 1.5 及之后
m := map[Point]string{
{29.935523, 52.891566}: "Persepolis",
}
工具链
- Vendor 支持:
go命令引入了对vendor目录的实验性支持。通过设置环境变量GO15VENDOREXPERIMENT=1开启。开启后,go命令会优先在vendor目录下查找依赖包。 - Internal 包: 任何名为
internal的目录下的包,只能被以internal父目录为根的目录树中的代码导入。这允许库作者在项目中隐藏实现细节。 - Trace 工具: 新增
go tool trace命令,用于细粒度的程序执行跟踪和可视化。 - Go Doc: 新增
go doc命令(区别于godoc),专为命令行使用设计,提供更简洁的文档查看体验。 - 构建模式:
go build增加了-buildmode选项,支持构建共享库(shared libraries)和插件等多种模式。
运行时
- 自举 (Self-hosting): 移除了所有 C 代码,编译器、链接器和运行时现在完全由 Go 和少量汇编语言编写。构建 Go 1.5 需要先安装 Go 1.4(或其他 Go 版本)作为引导编译器。
- 并发垃圾回收: 新的垃圾回收器旨在降低延迟。通过并发运行和更好的调度,STW (Stop-The-World) 暂停时间通常在 10 毫秒以下,甚至更低。
- GOMAXPROCS: 默认值从 1 更改为可用的 CPU 核心数。这可能会改变某些并发程序的行为,但通常会提高多核机器上的性能。
标准库
flag: 改进了PrintDefaults的输出格式,使其更易读。math/big: 新增Float类型,支持任意精度的浮点数运算。net: 在 Unix 系统上,DNS 解析器不再依赖 cgo,默认使用纯 Go 实现(如果配置允许),这减少了线程消耗。
参考资源
更多详细信息请参考官方发布说明:Go 1.5 Release Notes