這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
任何在 Zapier 或者聽過我周五快速演講的人都可以證明,我認為 Go 是一個很棒的程式設計語言。在這篇文章中,我將分享一下為什麼我認為它很棒,使用它的一些缺點,以及為什麼它還不是我們 Zapier 堆棧中的一部分。
Go 是 Google 開發的程式設計語言,旨在協助大型Team Dev成功構建和維護高效能軟體項目。 它於 2009 年起開源,並於 2012 年發布 Go 1.0。此後,許多組織,包括像 Docker 和 Hashicorp 這樣的突出的公司已經開始在項目中使用該語言取得圓滿成功。
Tocy 翻譯於 3天前 1人頂 頂 翻譯得不錯哦!
My First Go at Go
我寫第一行 Go 程式大概是在 4 年前。一開始,我不得“要領”。這個語言似乎很有趣,程式員們都在吹噓 Go 的好,但我對這些好處並沒有什麼概念。直到我把一個 Python 的真實項目移植到 Go,真實世界的需求才讓我欣賞到 Go 的美妙。
我移植的項目是使用 Redis 實現的一個非常小的 REST API。它只是一個簡單的緩衝系統,把“不活動的”資料移動到磁碟上,而把“活動的”資料保留在 Redis 中。我需要一個簡單的方法來分發這個 API 並配置 Redis 伺服器,使其不會消耗大量的記憶體,並保持快速。使用 Go 後,發現它的 Spoiler Alert 非常適合這樣的需求。
Viyi 翻譯於 3天前 1人頂 頂 翻譯得不錯哦!
為什麼 Go 是偉大的?
我認為 Go 是偉大的程式設計語言是很多原因。要是現實世界需要,我能夠在幾天內對一個生產系統進行原型設計、測試和部署,而且在每秒能處理比原來多 5 倍請求的情況下,CPU 和記憶體的開銷還都很小。
這是因為 GO 很簡單,只有一個非常小(但是很全)的標準庫。我能夠在幾個小時內掌握絕大部分語言概念,內嵌包,和常用語句。
無若 翻譯於 3天前 1人頂 頂 翻譯得不錯哦!
除此之外,Go 還有一些其它東西:
靜態類型
編譯
單獨的二進位發布
記憶體回收
內建並發和原語
可以串連到流行的 C 庫
豐富的文檔
擁有一個充滿活力並持續成長的社區
Zapier 一開始是一個 Python 商店。當上面所列的內容只有部分能在 Python 中實現的時候,實現了整個列表的 Go 顯得非常吸引人。我們每小時要處理數以千計的 API 呼叫,效能對於我們來說非常重要。那麼為什麼不換用 Go 呢?
Viyi 翻譯於 3天前 1人頂 頂 翻譯得不錯哦!
為什麼 Go 並不太好?
沒有完美的程式設計語言;一切都需要權衡。Go 在編譯速度和應用程式效能上很優秀,但這是以程式員的生產效率作為代價的。
在權衡的過程中,最有爭議的是 Go 提供了靜態類型系統,但卻沒有泛型。這就是說,容器類資料結構除列表和雜湊表之外,不能擺脫對未知類型指標( interface{} 類型)的類型轉換。
Viyi 翻譯於 3天前 1人頂 頂 翻譯得不錯哦!
Go 還有一些不利於編程的東西:
使用第三方代碼會讓依賴管理變得困難。
類型系統很簡單,但與經典的物件導向和繼承模型有很大不同。它非常像 C。結構 + 介面。沒有類。沒有繼承。
沒有規範的異常或 try/catch。這可能被認為是一種正面的架構,但 Go 經常讓開發人員們跌進其 panic(嚴重錯誤)/recover(恢複) 系統。
有些人認識記憶體回收並適不用於像 Go 這樣的系統程式設計語言。我是喜歡記憶體回收的那類人。
Viyi 翻譯於 3天前 1人頂 頂 翻譯得不錯哦!
Go! 用在哪裡比較好?
Go 非常適合系統編程。它被吹捧為中級語言,介於像 C 這樣的低級語言和像 Python 這樣的進階語言之間。這裡列了一些 Go 適合構建的應用類型:
命令列應用
網路服務
Daemons(守護進程)
資料庫
但是,甚至有人用它做這些事情:
Go 足夠靈活可以解決大多數問題,甚至有時候會比其它語言做得更好。這裡有一個使用 Go 的公司列表,讓人印象深刻,它包括 Docker、Cloudflare、Dropbox、Intel、Hashicorp,當然,還有 Google。
Viyi 翻譯於 3天前 1人頂 頂 翻譯得不錯哦!
然而… 為什麼 Zapier 仍然不使用它?
Zapier 是構建於 Python 和 Django 之上龐大的單體應用。它有大量使用 Python 完成的關鍵點,很難在在服務啟動並執行時候無縫切換到其它程式設計語言,雖然這並不是不可能!
我們在非常(非常!)早的階段把整個應用拆分成微服務架構。這些服務是按需執行。然而,一旦我們發現某個系統達到臨界狀態需要高效能重寫的時候,我認為 Go 是一個選擇。我們會遵循一個流程:
Viyi 翻譯於 3天前 0人頂 頂 翻譯得不錯哦!
衡量當前系統並確定瓶頸。
針對這個瓶頸制定 Go 的解決方案。
在產品中把這個解決方案作為 canary service 進行衡量。
啟動所有事情
(廢除並)替換
採用某種程式設計語言是個困難的決定,Go 並不是我們唯一考慮的語言。列表中還有別的一些語言,同樣存在著優點/缺點:
Elixir (在 Erlang VM 中)
Rust
Python 3 (我知道很瘋狂!)
PyPy
Cython
Viyi 翻譯於 3天前 0人頂 頂 翻譯得不錯哦!
綜上所述:Go 是個非常棒的程式設計語言,我們可以用它來構建高效能系統。在像大多數語言那樣進行權衡的時候,重點考慮的是穩定和便於使用。Go 學起來很容易,多數程式員在使用數周后都能使用它高效地編程。
也許有一天你會讀到另一篇文章,提到我們使用 Go 開發 ZYX 替代了 XYZ。如果你願意成為團隊的一員,考慮可能使用的新語言並改進我們現有的應用的話,來看看我們的職位。
Viyi 翻譯於 3天前 1人頂 頂 翻譯得不錯哦!