Go 博客

Go 1.6 发布

Andrew Gerrand
2016年2月17日

今天我们发布了 Go 1.6 版本,这是 Go 的第七个主要稳定版本。您可以立即从 下载页面 获取。虽然六个月前 Go 1.5 的发布 包含重大的实现变更,但此次发布更加侧重于渐进式改进。

最显著的变化是 net/http 包 支持 HTTP/2。HTTP/2 是一种新的协议,是 HTTP 的后续版本,已经得到了浏览器厂商和主要网站的广泛采用。在 Go 1.6 中,在使用 HTTPS 时,服务器和客户端都 默认启用 了对 HTTP/2 的支持,为各种 Go 项目带来了新协议的 优势,例如流行的 Caddy Web 服务器

模板包增加了一些新功能,支持 修剪模板操作周围的空格 以生成更简洁的模板输出,并引入了 {{block}} 操作,可用于创建基于其他模板构建的模板。一个 新的模板示例程序 演示了这些新功能。

Go 1.5 引入了对“vendor”目录的 实验性支持,该功能通过环境变量启用。在 Go 1.6 中,该功能现在 默认启用。如果源树包含一个名为“vendor”的目录,但未使用新功能的方式,则需要进行更改以避免构建失败(最简单的修复方法是重命名该目录)。

运行时增加了对并发误用 map 的轻量级、尽力而为的检测。一如既往,如果一个 goroutine 正在写入 map,那么任何其他 goroutine 都不应该并发地读取或写入该 map。如果运行时检测到这种情况,它将打印诊断信息并崩溃程序。了解此问题的最佳方法是使用 竞态检测器 运行它,它将更可靠地识别竞态并提供更多细节。

运行时还改变了打印程序终止 panic 的方式。它现在只打印 panic goroutine 的堆栈,而不是所有现有 goroutine 的堆栈。此行为可以通过 GOTRACEBACK 环境变量或通过调用 debug.SetTraceback 函数进行配置。

cgo 用户应该注意共享 Go 和 C 代码之间的指针规则发生了重大变化。这些规则旨在确保此类 C 代码能够与 Go 的垃圾回收器共存,并在程序执行期间进行检查,因此代码可能需要更改以避免崩溃。有关详细信息,请参阅 发布说明cgo 文档

编译器、链接器和 go 命令具有新的 -msan 标志,类似于 -race,仅在 linux/amd64 上可用,它支持与 Clang MemorySanitizer 进行交互。这对于测试包含可疑 C 或 C++ 代码的程序非常有用。您可以在使用新的指针规则测试 cgo 代码时尝试一下。

使用 Go 1.6 构建的 Go 程序的性能与使用 Go 1.5 构建的程序相似。垃圾回收暂停时间比 Go 1.5 更短,但这对于使用大量内存的程序尤其明显。关于编译器工具链的性能,构建时间应该与 Go 1.5 相似。

sort.Sort 内部的算法得到了改进,运行速度提高了约 10%,但此更改可能会破坏期望具有相同但可区分元素的特定排序的程序。此类程序应改进其 Less 方法以指示所需的排序,或使用 sort.Stable 来保留相等值输入的顺序。

当然,还有许多其他添加、改进和修复。您可以在全面的 发布说明 中找到所有这些内容。

为庆祝发布,世界各地的 Go 用户组 将于 2 月 17 日举行发布派对。在线上,Go 贡献者将在 golang subreddit 上进行为期 24 小时的问答环节。如果您对项目、发布或 Go 有任何疑问,请 加入讨论

感谢所有为此次发布做出贡献的人。祝您编程愉快。

下一篇文章:Go 1.7 发布
上一篇文章:Go 中的语言和区域设置匹配
博客索引