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