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