從Node.js 轉到 Go平臺
在用 Node.js 建立了 Bowery 的第一個迭代版本后,我們在2014年2月切換到了 Go,我們的開發(fā)和部署速度也因此得到提升。
從那以后,我們整個團隊都變成了專職的地鼠(譯者注:Go 的吉祥物)。Go 清晰明確的標準和更簡便的工作流程讓我們用 Go 用得很舒服。下面是我們熱愛用 Go 進行工作的原因,你可以從中瞄一眼我們的地鼠洞。
容易編寫跨平臺代碼
我們切換成 Go 的其中一個最大原因就是它是那么容易去為不同系統(tǒng)編譯代碼。
在 Bowery, 我們在建立一個能幫忙你和你的團隊管理你們的開發(fā)環(huán)境的app,我們必須要高效地支持所有操作系統(tǒng)——Linux,Windows 還有 OSX。在Go中,你可以為不同的操作系統(tǒng)定義不同的文件,從而實現(xiàn)依賴于操作系統(tǒng)的功能。一個絕佳的例子就是我們的同伴 Larz 在構建一個從命令行讀取用戶輸入的包 Prompt 的事。Larz 希望去創(chuàng)建一個 Go 包用來實現(xiàn)跨平臺的行編輯提示。這在 Go 中是如此簡單:為每個操作系統(tǒng)創(chuàng)建不同的文件,Go 編譯器會根據(jù)操作系統(tǒng)來選擇應使用的文件來生成最終內容。
為其他的系統(tǒng)編譯代碼同樣很簡單,你要做的僅僅是設置一個環(huán)境變量,然后你就有了一個你在 Linux 系統(tǒng)上編譯的 Windows 二進制文件。
更快的部署
Go 是一款編譯型語言并且可以更輕松地在多個平臺上分發(fā)應用。 對我們而言,部署和測試是很重要的,同時也是我們最終用戶的一個資產(chǎn)。通過 Go,構建服務然后運行測試會很容易,因為遷移到生產(chǎn)環(huán)境的服務器時就準備好了。 Go 不需要任何的系統(tǒng)依賴,讓它的發(fā)布真的很簡單。 當要發(fā)布命令行工具或者其它應用時,我們的用戶不需要擔心要安裝Java,RVM或者NPM才能運行。 我們喜歡這篇Jeremy Saenz 的文章,他討論了為什么他把他所有的命令行工具遷移到Go(CLI tools to Go)。
并發(fā)基元
當切換到Go時我們意識到Node.js的事件循環(huán)并不是一切。Node.js 沒有提供太多的并發(fā)基元。唯一能同時運行的是I/O程序和定時器等。你無法通過這些程序通訊,所以用Node.js建立一個敏捷的系統(tǒng)是一個挑戰(zhàn)。使用Go,你可以在運行任意并程序的同時,提供一個頻道去給程序發(fā)送信號讓它做一些事情,或者給它們發(fā)送一些值來共享數(shù)據(jù)。Go還提供了像 mutexes, wait groups等低級別的并發(fā)基元 。 有的你可能在NPM上找到,但我們發(fā)現(xiàn)在處理并發(fā)和并行時頻道是決定性因素。
集成測試框架
用Node.js的時候,我們已經(jīng)有了我們的測試框架選擇,但一些框架對于前端來說更好用,比如Jasmine, 其它的框架則對后端來說更好用,比如Mocha。也有其它的選擇像JSUnit和PhantomJS,如果你看過StackOverflow的這篇文章,那里也有人推薦許多的框架。在一些世界里,選擇是一件好事,但使用Go的時候,我們喜歡測試框架的規(guī)范化。在Go里,所有的測試包都是內置的。如果你需要寫一個新的測試套件,你必須做就是把(文件名)_test.go文件加到你要測試的軟件的同一個包里,它將會在你每次執(zhí)行go test的時候運行。
你可以在writing tests with Go學到更多關于Go 測試的知識。 需要測試HTTP services? Go同樣提供了httptest包
標準庫
我們喜歡僅用Go的標準庫就能寫大多數(shù)的軟件。用Node.js時,我們幾乎都是不得不引入一個外部的庫, 這樣做既增加了部署的時間,也增加了來自第三方軟件的潛在隱患。只用標準庫能讓我們寫的代碼更快更安全。
開發(fā)者用的工作流工具更強大
Node.js除了NPM的包和腳本控件,沒有真正的標準化的工作流。除此之外, 因為這些工具是社區(qū)創(chuàng)造的,雖然很好用但是實在太多了,以至于最終的結果就是事情被每個人以不同的方式完成了。在Go里工作流標準化的一個很好的例子就是工作區(qū)的布局。你要放棄很多開發(fā)自由因為你必須遵守工作區(qū)的布局,不過它提供了大量的結構:你可以保留你的Go源碼和依賴在同一個位置。在你的工作區(qū)你有3個根目錄: src 放源碼包,pkg放編譯過的包,bin放可執(zhí)行的程序。讓你的源碼和依賴放在一個單獨的工作區(qū)是一個最佳實踐, 讓它在每個人的機器上都是這個標準。在團隊合作里這些可預測性是讓人滿意的。我們可以去任何人的機子上提供幫助,并且知道我們的代碼將會出現(xiàn)在$GOPATH/src/github.com/Bowery這個路徑,而不是其它像$HOME/some/path/to/Bowery這樣的路徑。類似的,gofmt用同樣的方式格式化每個人的代碼。對于一些膚淺的問題,像組織代碼和代碼風格差異在Go里根本不需要擔心,這是一個大大的解放。你可以專注修復你的問題,其它的事都被考慮到了。
還有一大堆其它的原因去喜歡Go,我們看到越來越多的公司采用Go讓內部應用變得更強大并且是可分布式的。但總的來說,Go團隊發(fā)現(xiàn)如果你創(chuàng)造標準并弄成范例讓別人同意的話,開發(fā)者們會更高產(chǎn)。 比如, MongoDB 的應用管理團隊喜歡用Go的"明智的、 統(tǒng)一的開發(fā)經(jīng)驗"。 在 Soundcloud,他們喜歡用Go嚴格的格式化代碼規(guī)則和“實現(xiàn)的方式只有一種”的哲學。這意味著你會在代碼審查和爭論代碼風格和格式上花很少的時間,而可以用更多的時間去解決你問題的根源。
如果你剛開始使用Go并且想了解更多,這里有一些資源可以看看。
閱讀Golang 官方博客的更新和核心團隊的公告
閱讀核心團隊提供在官網(wǎng)的學習文檔
我們喜歡Ardan工作室的Bill Kennedy寫在博客 Going Go Programming 上的竅門和指南
Go by Example 有一堆用Go寫的不同任務的例子
GopherAcademy 有很多關于Go的最佳實踐的文章
Brian McCallister 有一篇很好的文章是 Go 工作區(qū)和總體開發(fā)環(huán)境
更多關于Go的代碼組織,閱讀Jared Carroll發(fā)布在 Pivotal Labs blog 的文章
如果要開始你的第一個Go項目,設置你的新環(huán)境并在Bowery分享給你的團隊吧。
請您花一點時間將文章分享給您的朋友或者留下評論。我們將會由衷感謝您的支持!
相關文章
Go 簡單實現(xiàn)多租戶數(shù)據(jù)庫隔離
本文主要介紹了Go 簡單實現(xiàn)多租戶數(shù)據(jù)庫隔離,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-05-05