跳到主要内容
版本:2.9.x(Latest)

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