BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Go 1.9引入了类型别名并提升了运行时和工具支持

| 作者 Sergio De Simone 关注 17 他的粉丝 ,译者 张卫滨 关注 13 他的粉丝 发布于 2017年9月4日. 估计阅读时间: 3 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

最近发布的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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT