写点什么

Go 1.1 正式发布,性能显著改善、语言细微变化

  • 2013-05-14
  • 本文字数:2206 字

    阅读完需:约 7 分钟

最近,Go 1.1 正式发布,相比 1.0,Go 1.1 包含了许多改进。最重要的改进是性能。优化的地方包括编译器、链接器、垃圾回收器、goroutine 调度、map 实现和部分标准库等等。开发者编写的代码在 Go 1.1 环境中性能会明显提高。

语言本身也有一些细微的变化,其中值得注意的两处是:

  • return 语句的变化,会使程序结构更加整洁。
  • 方法值(mehod value)的引入会便于将方法作为函数值绑定到它的接收者。

在 Go 1.1 中,并发编程更加安全,引入了 race detector 查找内存的同步错误。具体的细节可以查看手册

相关工具和标准库也得到了改进和扩展,详细内容可以查看发布说明

去年三月份,Go 1.0 正式发布,之后陆续发布了三个小版本,都是为了解决严重问题。根据兼容性指南,Go 1.1 与1.0 保持兼容,所以建议开发者都升级到最新版本。

Go 在并发编程方面的显著优势让其在短时间内引起了社区和公司的重视和实践。例如,InfoQ 之前曾经报道过 Iron.io 从 Ruby 迁移到 Go 的明显改进:

  • 服务器数量从 30 台减少到 2 台,而且第 2 台仅用于实现冗余。
  • CPU 利用率下降至 5% 以下。
  • 所用内存也下降了很多。Rails 应用在启动时需要接近 50MB 内存,而 Go 版本在启动时只需要几百 KB 内存。
  • 连锁故障成为历史。
  • 运行于成百上千台服务器上的新服务完全用 Go 编写。
  • 他们认为,Go 的使用使他们得以“构建伟大的产品,得以成长和扩展,同时还能吸引一流人才”。他们的博客中写道:“我们认为,在可预见的未来,它将继续帮助我们成长。”一般建议根据人才库的规模来选择编程语言,他们发现 Go 语言的选择帮助他们吸引了顶级人才。
  • 容易部署,因为 Go 程序会编译为一个单一静态映像。
  • Go 存在的小问题:需要学习一种新语言,库还有限。
  • 如果服务器流量很高,或者你想应对突发的增长,Go 是很好的选择。

“Go Web 编程”作者谢孟军在接受 InfoQ专访时也谈到了 Go 在 Web 编程方面的优势

Go 语言设计的时候是系统级别的语言,所以他本身就有性能上面的优势。其次 Go 在 Web 开发中内置的 net/http 包对于开发 Web 非常方便,用户可以很方便的就搭建一个 Web 应用。熟悉 PHP 的同学可能对于 nginx+fastcgi 配置都很熟悉,但是 Go 开发的应用就不需要 nginx,因为它自己就可以监控网络,解析数据包,而不依赖任何东西,你编译完之后扔到服务器起来就好了,这省去了一些部署的部分。最后就是 Go 的并发支持,大家都听说过摩尔定律,硬件只会越来越快,CPU 的核数也会越来越多,那么 Go 的这个特性就让我们这些程序员从以前的多线程处理中解放出来,让 Go 语言的 runtime 来帮我们做这个事情,那用使用 Go 来编写 Web 何乐而不为呢?

“Go 语言编程”作者 Mark Summerfield总结了 Go 语言的关键优点:

  • 像闪电一样快的编译。这使得编辑 / 编译 / 运行的周期和 Python 的编辑 / 运行周期一样快。
  • 非常高级的并发。你可以很轻松地使用 Go 语言编写并发程序,而不会有任何显式的锁。另外,goroutine 通过操作系统线程多路传输的方式,这意味着,如果你的算法最好以成千上万个并发线程来表示,那么你就可以创建那么多 goroutine——而对于线程,通常最好不要创建过多。
  • 无初始化和垃圾回收。这让我们避免了整整两类错误的发生,让编码更简单。
  • 语言本身非常小,让一般的程序员就可以掌握。当考虑模板语言的时候,C++98/03 已经不是一般程序员所能接受的, 而 C++11 更大,也更复杂。与它们相比,Go 语言:
  • 使用了新奇的方式来实现面向对象。我发现这种方法很有趣。
  • 对 Unicode 的支持。我非常喜欢 Go 语言让你可以使用原生 UTF-8 或者使用根据你想要的来使用 Unicode 字符的方式。

但是,开发社区对 Go 的看法并不总是积极的,Python 和 Go 语言的实践者 Yuval Greenfield 在“ Why I’m not leaving Python for Go ”的博文中批评了 Go 语言的错误处理机制。他首先引用了 Go 语言的设计者对错误处理机制的看法:

在 Go 语言中,错误处理非常重要。语言的设计和规范鼓励开发人员显式地检查错误(与其他语言抛出异常然后 catch 住是不同的)。这种机制某种程度上使得 Go 语言的代码冗长重复,但是幸运的是你可以利用一些技巧来把冗长的代码最小化。

Yuval 表示这点他无法忍受,每一次函数的调用都需要 if 语句来判断是否出现错误。Go 语言并没有坚持要采用这种冗长的错误机制。它也允许忽略这些函数调用错误。但是这样做很危险。理论上,我们要求开发人员决不能忽略返回的错误。而实际上,只有在一些关键性的错误上面处理才是必要的。关于 panic/recover 机制,Yuval 认为也不够出色,因为连 Go 的标准库都不怎么用这种机制:为什么索引溢出的数组要比错误格式的字符串或者失败的网络连接更需要 panic 呢?Go 语言希望能够完全避免异常,但实际上不能,总有一些异常会在某处发生,让开发人员在错误出现时感到困惑。

Mark Summerfield 认为 Go 语言的操作符重载存在问题:

IMO 这个大程序包(针对 big.Int 和 big.Rat 类型)很难使用,因为你无法对操作符重载。另外,尽管 Go 缺少泛型,但那只是针对于类库编写者的问题。由于 Go 拥有其它语言特性,所以不太需要泛型,比方说它对“<”的操作符重载对于定义自定义的数据类型就非常好。

不管怎样,虽然在最新一期的 TIOBE 编程语言排行榜前二十名的榜单中看不到 Go 语言的身影,但是 Go 语言的崛起已经势不可挡,更多的开发者准备或者已经开始实践 Go 语言编程了,在上个月刚刚结束的 QCon 北京 2013 大会上,“新锐编程语言”专题中特意包含了 Go 语言相关的演讲。

2013-05-14 09:092820
用户头像

发布了 501 篇内容, 共 257.4 次阅读, 收获喜欢 61 次。

关注

评论

发布
暂无评论
发现更多内容

持续交付-Pipeline入门

霍格沃兹测试开发学社

技术分享 | 如何模拟真实使用场景?mock 技术来帮你

霍格沃兹测试开发学社

Kafka入门

霍格沃兹测试开发学社

技术分享 | 使用 cURL 发送请求

霍格沃兹测试开发学社

Health Kit基于数据提供专业方案,改善用户睡眠质量

HarmonyOS SDK

HMS Core

简洁又优雅!Controller层代码就该这么写!

java易二三

Java 程序员 面试 计算机 八股文

JaCoCo助您毁灭线上僵尸代码 | 京东物流技术团队

京东科技开发者

Java JACOCO 企业号 8 月 PK 榜 僵尸代码

使用Fastmonkey进行iosMonkey测试初探

霍格沃兹测试开发学社

你们的优雅停机真的优雅吗? | 京东云技术团队

京东科技开发者

Java Spring Boot JVM 优雅停机 企业号 8 月 PK 榜

技术分享 | 测试平台开发-前端开发之Vue.js 框架的使用

霍格沃兹测试开发学社

接口测试框架实战(一) | Requests 与接口请求构造

霍格沃兹测试开发学社

LangChain系列-02. LLM基础

无人之路

openai ChatGPT langchain

秒杀库存解决方案

Java研究者

架构 高性能 秒杀 电商系统 库存系统

智奇数美:用下沉思维做产品,深挖呼叫中心产业新蓝海

江湖老铁

为什么要urlencode?

霍格沃兹测试开发学社

JDK 17 营销初体验 —— 亚毫秒停顿 ZGC 落地实践 | 京东云技术团队

京东科技开发者

ZGC jvm调优 jdk17 企业号 8 月 PK 榜

Log4j疯狂写日志问题排查 | 京东云技术团队

京东科技开发者

Java log4j Log4j 2 企业号 8 月 PK 榜

技术分享 | 抓包分析 TCP 协议

霍格沃兹测试开发学社

浅谈测试需求分析

霍格沃兹测试开发学社

Apache Paimon 在同程旅行的实践进展

Apache Flink

大数据 flink 实时计算

接口协议之抓包分析 TCP 协议

霍格沃兹测试开发学社

技术分享 | 接口测试之HTTP、HTTPS 抓包分析

霍格沃兹测试开发学社

干货 | 利用 pytest 玩转数据驱动测试框架

霍格沃兹测试开发学社

技术分享 | app自动化测试(Android)--显式等待机制

霍格沃兹测试开发学社

实力!云起无垠获ISC 2023创新独角兽沙盒大赛“创新能力奖”

云起无垠

干货 | 在Docker 上搭建持续集成平台 Jenkins

霍格沃兹测试开发学社

开放原子开源基金会开源安全委员会七月新增成员单位

开放原子开源基金会

开放原子开源基金会

接口管理工具YApi怎么用?颜值高、易管理、超好用

霍格沃兹测试开发学社

基于飞桨图学习框架实现的城市地点动态关系挖掘

飞桨PaddlePaddle

人工智能 paddle 百度飞桨 开发者说

Spring 中 @Qualifier 注解还能这么用?

江南一点雨

Java spring

技术分享 | app自动化测试(Android)-- 参数化用例

霍格沃兹测试开发学社

Go 1.1正式发布,性能显著改善、语言细微变化_Google_崔康_InfoQ精选文章