在最近发布的Go 1.9中,最重大的变化就是支持通过声明类型别名(type alias)实现渐进式代码修复(gradual code repair)。Go 1.9同时还提升了垃圾收集器和编译器。
根据Google的工程师Russ Cox所述,渐进式代码修复是代码重构中一种很有用的方式,对于大型的代码库来说很有价值。简而言之,渐进式代码修复的目标是通过一系列的步骤完成一个较大规模的重构,也就是说不会在一次自动化的提交中完成所有的变更,而是分成多次提交。原子性的重构方式在概念上通常很简单,但是如果代码库很大的话,就会造成规模很大的代码提交,这样很难审查和合并。借助渐进式代码修复,我们可以按照三个步骤来重构代码:首先,引入新的API,它应该能与旧的API共存,所以我们不必立即修改所有使用旧API的代码;然后,我们将使用旧API的所有地方替换为新API;最后,将旧的API移除。
为了启用渐进式代码修复,必须能为常量、函数、变量和类型创建另外一个备选的名称。现在,Go允许通过如下的方式声明类型别名:
type OldAPI = NewPackage.API这样的话,所有引用OldAPI的地方都会使用重构之后的类型。如果读者对渐进式代码修复的更多讨论感兴趣的话,那么Russ Cox的阐述是不容错过的。
按照Google的工程师Francesc Campoy所述,针对Go 1.9所付出的大多数工程方面的努力都投入在提升运行时、核心库以及工具方面。最重要的变更包括:
Go的垃圾收集提供了更好的性能,这要归功于一些库函数会触发并发垃圾收集机制,这样的话只会阻塞调用协程(goroutine),而不会阻塞整个程序。另外,大对象的堆内存分配也得到了明显提升。
Go 1.9编译器能够并行编译同一个包中的函数。在之前版本的编译器中,已经支持了并行编译不同包中的函数。
在核心库方面,Go 1.9借助单调时间跟踪(monotonic time tracking),让time包的使用变得更加安全。这样的话,即便是存在挂钟时间调整(wall clock adjustment),Time的对比也会更加容易。另外,在sync包中,新的Map类型提供了一个线程安全的并发map,具有恒定分摊时间(amortized-constant-time)的加载、存储和删除功能。
要了解Go 1.9的所有变更的话,可以参考发布文档。
查看英文原文:Go 1.9 Introduces Type Aliases, Improves Runtime and Tooling