随着业务的发展、性能的挑战、需求的变更以及技术的更新,一个应用从某一个技术栈转向另一个技术栈是很正常和合理的,如淘宝从 PHP 转向 Java、 Twitter 从 Ruby 转向 Java/Scala 、 Linkin 从 Ruby 转向 Node.js 、 Groupon 从 Ruby 转向 Node.js 、 Dropbox 从 Python 转向 Go 等。Go 语言从一面世就受到了很多开发者的关注,它能够提高开发人员的编程效率,它的并行机制使得开发者能够非常容易地编写多核和网络应用,开发人员利用它的类型系统能够很容易地构建出富有灵活性和扩展性的模块化程序。现在,越来越多的项目基于 Go 语言实现,如著名的开源容器 Docker 、PaaS 平台 Deis 、Google 的云计算平台 Kubernetes 以及国内的七牛云存储产品等。 Bowery 是一个基于云技术的开发平台,其在 2014 年进行了一次从 Node.js 到 Go 的转换,且这次技术栈的变更加快了开发和部署的速度。近日,Bowery 对这次技术栈转换进行了总结,并归纳出了他们认为 Go 优于 Node.js 的一些原因。现对这些原因进行一个全面整理以供读者参考和学习,具体内容如下:
- 强大的跨平台编程能力
Go 具有很强的跨平台性,基于 Go 的程序能够在不同系统 (Linux、Windows、OSX 等) 中编译,所以在开发过程中,借助 Go 能够轻松实现跨平台编译,而开发者只需设置不同的环境变量,这样就大大提高了开发效率。 - 快速部署
Go 属于编译语言且具有跨平台性,从而使得 Go 开发的分布式应用能够运行在不同的平台上。在 Go 平台中,从测试环境到正式环境的切换无需额外的系统依赖,从而能够实现快速的部署。 - 并发原语的支持
Node.js 没有提供较多的并发原语,仅有 I/O 程序或计时器运行在并发模式,所以 Node.js 在并发处理方面处于劣势,且很难构建出快速响应的跨程序通讯系统。而 Go 提供了语言级别的并发特性 goroutine、基于通道(channel)的通信机制和更底层的并发处理基元,如 mutexes 、 wait groups 等,Go 显得更加适合于构建高并发的应用。 - 标准化的集成测试框架
用于 Node.js 的测试框架有很多,有些适用于前端测试,有些适用于后端测试,但多是第三方的测试框架,如 Jasmine 、 Mocha 、 JSUnit 和 PhantomJS 等。而 Go 提供了内建的完整测试包,如果开发者想编写一个新的测试套件,只需把 _test.go 文件添加到相同的包里即可。有关 Go 测试的更多相关信息,请读者点击这里查看,此外,Go 还提供了使用 httptest 包进行测试的文档。 - 标准库
如果使用 Node.js 开发一个应用,开发者不得不引入额外的依赖扩展库, 从而增加了应用的部署时间和不稳定性。然而 Go 提供了标准库,标准库的好处是无需包含其他扩展库即可实现一个应用的开发,从而节省应用的开发、部署的时间,并且还能够增强应用的健壮性。 - 强大的开发者工作流工具
除了使用 NPM 和脚本控制外,Node.js 没有提供真正、标准的工作流工具。而 Go 所提供的工作区布局能够帮助开发者建立标准化的工作流、规范应用的开发。尽管使用标准的工作区布局会损失开发的灵活性,却获得了一个结构化、有条理的工作区,该工作区包括三个根目录:src 用于放置源码包,pkg 用于放置编译包,bin 用于放置的是执行文件。把源码和依赖文件集中放到一个单一的工作空间是一个最佳的实践,这样使的团队成员都有一个标准的文档结构。此外,gofmt 也是一个非常使用的工具,它能以相同格式对代码进行格式化。
以上这些原因是 Bowery 根据自己的实际经历而得出,另外,还有其他公司 / 团队觉得 Go 值得喜欢的一些原因,如 MongoDB 的项目管理团队喜欢 Go 的智能、统一的开发体验,音乐分享服务 Soundcloud 团队喜欢 Go 严格的代码格式规则以及单一方式实现功能的理念。总之这些特征能够节省针对代码规范和格式审查所花费的时间,从而使得开发者能够集中精力来解决关键的问题以提高工作效率。
最后作者为 Go 语言开发者提出了几点建议,如经常访问官方博客和官方学习文档、访问Bill Kennedy 的 Go 编程博客等。
此外,关于 Go 和 Node.js 的选择,Node.js 社区最活跃和高产的成员之一 TJ Fontaine 在个人博客中公布了自己放弃 Node.js 而转向 Go 的原因,主要是因为Go 更适合高并发和分布式应用开发;最高产的Node.js 开发者之一 Duncan Smith 在个人博客中列举出了自己为什么不从Node.js 转向Go 的原因,有兴趣的读者可以前去阅读。
感谢郭蕾对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。
评论