从Node.js 转到 Go平台

(编辑:jimmy 日期: 2024/12/23 浏览:2)

在用 Node.js 建立了 Bowery 的第一个迭代版本后,我们在2014年2月切换到了 Go,我们的开发和部署速度也因此得到提升。

从那以后,我们整个团队都变成了专职的地鼠(译者注:Go 的吉祥物)。Go 清晰明确的标准和更简便的工作流程让我们用 Go 用得很舒服。下面是我们热爱用 Go 进行工作的原因,你可以从中瞄一眼我们的地鼠洞。

容易编写跨平台代码

我们切换成 Go 的其中一个最大原因就是它是那么容易去为不同系统编译代码。

在 Bowery, 我们在建立一个能帮忙你和你的团队管理你们的开发环境的app,我们必须要高效地支持所有操作系统——Linux,Windows 还有 OSX。在Go中,你可以为不同的操作系统定义不同的文件,从而实现依赖于操作系统的功能。一个绝佳的例子就是我们的同伴 Larz 在构建一个从命令行读取用户输入的包 Prompt 的事。Larz 希望去创建一个 Go 包用来实现跨平台的行编辑提示。这在 Go 中是如此简单:为每个操作系统创建不同的文件,Go 编译器会根据操作系统来选择应使用的文件来生成最终内容。

为其他的系统编译代码同样很简单,你要做的仅仅是设置一个环境变量,然后你就有了一个你在 Linux 系统上编译的 Windows 二进制文件。

更快的部署

Go 是一款编译型语言并且可以更轻松地在多个平台上分发应用。 对我们而言,部署和测试是很重要的,同时也是我们最终用户的一个资产。通过 Go,构建服务然后运行测试会很容易,因为迁移到生产环境的服务器时就准备好了。 Go 不需要任何的系统依赖,让它的发布真的很简单。 当要发布命令行工具或者其它应用时,我们的用户不需要担心要安装Java,RVM或者NPM才能运行。 我们喜欢这篇Jeremy Saenz 的文章,他讨论了为什么他把他所有的命令行工具迁移到Go(CLI tools to Go)。

并发基元
当切换到Go时我们意识到Node.js的事件循环并不是一切。Node.js 没有提供太多的并发基元。唯一能同时运行的是I/O程序和定时器等。你无法通过这些程序通讯,所以用Node.js建立一个敏捷的系统是一个挑战。使用Go,你可以在运行任意并程序的同时,提供一个频道去给程序发送信号让它做一些事情,或者给它们发送一些值来共享数据。Go还提供了像 mutexes, wait groups等低级别的并发基元 。 有的你可能在NPM上找到,但我们发现在处理并发和并行时频道是决定性因素。

集成测试框架

用Node.js的时候,我们已经有了我们的测试框架选择,但一些框架对于前端来说更好用,比如Jasmine, 其它的框架则对后端来说更好用,比如Mocha。也有其它的选择像JSUnit和PhantomJS,如果你看过StackOverflow的这篇文章,那里也有人推荐许多的框架。在一些世界里,选择是一件好事,但使用Go的时候,我们喜欢测试框架的规范化。在Go里,所有的测试包都是内置的。如果你需要写一个新的测试套件,你必须做就是把(文件名)_test.go文件加到你要测试的软件的同一个包里,它将会在你每次执行go test的时候运行。
你可以在writing tests with Go学到更多关于Go 测试的知识。 需要测试HTTP services"明智的、 统一的开发经验"。 在 Soundcloud,他们喜欢用Go严格的格式化代码规则和“实现的方式只有一种”的哲学。这意味着你会在代码审查和争论代码风格和格式上花很少的时间,而可以用更多的时间去解决你问题的根源。

如果你刚开始使用Go并且想了解更多,这里有一些资源可以看看。

阅读Golang 官方博客的更新和核心团队的公告
阅读核心团队提供在官网的学习文档
我们喜欢Ardan工作室的Bill Kennedy写在博客 Going Go Programming 上的窍门和指南
Go by Example 有一堆用Go写的不同任务的例子
GopherAcademy 有很多关于Go的最佳实践的文章
Brian McCallister 有一篇很好的文章是 Go 工作区和总体开发环境
更多关于Go的代码组织,阅读Jared Carroll发布在 Pivotal Labs blog 的文章
如果要开始你的第一个Go项目,设置你的新环境并在Bowery分享给你的团队吧。

请您花一点时间将文章分享给您的朋友或者留下评论。我们将会由衷感谢您的支持!