1. 程式人生 > >從Node.js 轉到 Go平臺

從Node.js 轉到 Go平臺

在用 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? Go同樣提供了httptest包

標準庫

我們喜歡僅用Go的標準庫就能寫大多數的軟體。用Node.js時,我們幾乎都是不得不引入一個外部的庫, 這樣做既增加了部署的時間,也增加了來自第三方軟體的潛在隱患。只用標準庫能讓我們寫的程式碼更快更安全。

開發者用的工作流工具更強大

Node.js除了NPM的包和指令碼控制元件,沒有真正的標準化的工作流。除此之外, 因為這些工具是社群創造的,雖然很好用但是實在太多了,以至於最終的結果就是事情被每個人以不同的方式完成了。在Go裡工作流標準化的一個很好的例子就是工作區的佈局。你要放棄很多開發自由因為你必須遵守工作區的佈局,不過它提供了大量的結構:你可以保留你的Go原始碼和依賴在同一個位置。在你的工作區你有3個根目錄: src 放原始碼包,pkg放編譯過的包,bin放可執行的程式。讓你的原始碼和依賴放在一個單獨的工作區是一個最佳實踐, 讓它在每個人的機器上都是這個標準。在團隊合作裡這些可預測性是讓人滿意的。我們可以去任何人的機子上提供幫助,並且知道我們的程式碼將會出現在$GOPATH/src/github.com/Bowery這個路徑,而不是其它像$HOME/some/path/to/Bowery這樣的路徑。類似的,gofmt用同樣的方式格式化每個人的程式碼。對於一些膚淺的問題,像組織程式碼和程式碼風格差異在Go里根本不需要擔心,這是一個大大的解放。你可以專注修復你的問題,其它的事都被考慮到了。

還有一大堆其它的原因去喜歡Go,我們看到越來越多的公司採用Go讓內部應用變得更強大並且是可分散式的。但總的來說,Go團隊發現如果你創造標準並弄成範例讓別人同意的話,開發者們會更高產。 比如, MongoDB 的應用管理團隊喜歡用Go的"明智的、 統一的開發經驗"。 在 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分享給你的團隊吧。

請您花一點時間將文章分享給您的朋友或者留下評論。我們將會由衷感謝您的支援!