Go 語言誕生於谷歌,由計算機領域的三位宗師級大牛 Rob Pike、Ken Thompson 和 Robert Griesemer 寫成。因爲出身名門,Go 在誕生之初就吸引了大批開發者的關注。誕生十年以來,已經涌出了不少基於 Go 的應用。就在很少久以前,知乎也捨棄了 Python,轉 用Go 重構推薦系統 。前端
做者:華爲雲技術宅基地
連接:https://zhuanlan.zhihu.com/p/57895717mysql
谷歌前員工 Jake Wilson 認爲,比起你們熟悉的 Python,Go 語言其實有不少優良特性,不少時候均可以代替 Python,他已經在不少任務中使用 Go 語言替代了 Python。那麼 Go 語言到底有着什麼樣的獨特魅力?它有哪些勝於 Python 的地方呢?讓咱們一塊兒來了解一下吧!android
出身名門的 Go 語言nginx
對於一門只有十年曆史的新語言,Go 的發展勢頭至關迅猛,容器界的扛把子 Docker 就是用 Go 寫的,國內也有很多團隊普遍使用 Go。近日,HackerRank 在社區發起了程序員技能調查,來自 100 多個國家、超過 70000 名開發者參與其中。調查結果顯示,2019 年,程序員最想學習的編程語言 Top 3 分別是 Go、Kotlin 和 Python,其中 Go 以 37.2% 的比例排在首位。git
但 Go 要想撼動編程界的常青樹 Java 二十多年的地位無疑難度頗大。據 HackerRank 數據顯示,2018 年,Java 在開發者最受歡迎的編程語言排行榜中仍然排名第 2,Python 排名第 4,Go 排名第 13,距離第一名 JavaScript 還有不小的差距。程序員
但對本文做者 Jack Wilson 來講,Go 語言雖然「年紀尚小」,但已經擁有不少很是優秀的特性。github
在不少任務上,我已經用 Go 語言代替了 Python,舉幾個例子:sql
這些任務大可能是一次性的,因此使用腳本語言操做就會比較合適。這些任務須要快速地編程,而代碼用過一次通常就捨棄了。通常來講,這種任務的需求都比較新穎、比較專,其代碼不多須要複用。下面就來介紹一下,針對這種任務爲何能夠用 Go 語言來替代 Python。mongodb
我常常在寫 Python 時犯很低級的錯誤。我會給變量或函數命錯名,或向它們傳遞錯誤的參數。這樣的錯誤用調試工具能夠找出一部分,但這種工具通常須要專門設置。我歷來沒很方便地配置過 pylint,並且我也不喜歡用那些很重的、配置起來更麻煩的 IDE。最慘的狀況是,你可能會不當心打錯變量名,而這種錯誤又不太容易發現。你的腳本可能會跑好幾個小時才趕上這個錯誤,而後一切都崩潰了,你又得從頭開始跑這個腳本。這種錯誤大部分均可以靠單元測試檢出,但單元測試不多能覆蓋 100% 的代碼,並且我並不想浪費時間去給一個只用一次的腳本寫單元測試。而帶編譯器的語言就能夠解決以上全部問題。編譯器能夠檢測出你犯的全部低級錯誤。出於這點緣由,我在寫長達幾百行的代碼時,更傾向於使用 Go 這類語言。數據庫
然而,須要編譯的語言的一個缺點是,通常你的開發速度會降低。這點在 C/C++ 和 Java 等語言上體現得尤爲明顯。而 Go 是一個很是簡單的語言,我發現它的開發速度並無被拖慢多少。不要誤會,個人意思並非說它比 Python 還快,而是想說,用 Go 語言沒有比 Python 慢不少,通常達到使用 Python 開發速度的 85% 仍是沒問題的。相對於擁有編譯器能避免的那些低級錯誤來講,我認爲犧牲 15% 的開發速度仍是很值的。
你可能已經知道,Go 語言就是爲並行而生的。在個人團隊裏常常會須要並行程序,由於咱們要在 S3 上操做咱們數據庫中大量的數據。若是該任務是 IO 密集型的(實際上不少任務都是),咱們就能夠很容易地部署 Python 線程。但若是任務是 CPU 密集型的,用 Python 就比較不方便了,由於有全局解釋器鎖的存在。我很是享受在 Go 語言中簡單代碼不用修改就能直接多線程運行的爽快感。不知你在 Python 中有沒有遇到過這種問題:直接複製粘貼的多線程代碼卻徹底不工做。在 Go 語言中就不會有此問題。
我比較喜歡把全部依賴放在單個二進制文件裏。我常常在 EC2 服務器上運行本身的腳本,好讓環境更加接近咱們在 S3 上的服務器。若是用 Python 的話,我須要保證全部須要的包都在服務器上裝好,並且個人同事不能在服務器上裝任何可能產生衝突的包。虛擬環境能夠解決大部分問題,但我仍是以爲用 Go 語言更方便。我通常是在 Mac 和 Linux 上交叉編譯個人代碼,將其拷貝到遠程服務器上,而後就能夠任其運行了。個人代碼所須要的全部依賴都在一個二進制文件裏。
一開始,Go 語言的格式化工具 gofmt 實在是讓我抓狂,尤爲是它在代碼縮進時要求使用 tab 鍵而不是空格鍵。我以爲這簡直是瘋了。可是我用了一段時間後,就開始「真香」了。寫代碼時,我在格式上能夠天馬行空,格式化工具會幫我完成一切。個人全部代碼風格都是一致的,即便我是在寫不一樣的項目。這是由於格式化是標準 Go 工具的一個特性。但我若是想在 Python 中實現這一點,就要費些勁兒了。我須要正確地配置 pylint 工具,並要保證在每個項目中都使用它。
Gofmt 只是 Go 語言衆多工具中的一個小例子。全部我喜歡用的編輯器——VSCode,vim 和 Sublime Text 中,都有 Go 語言相應的擴展,讓我可以方便地享受到 Go 工具的優勢。這樣,我就能得到寫 Java 時的那種智能體驗,卻不須要真正使用一個 IDE。我在用 Python 時從未得到過這種體驗。
我每次看到批評 Go 語言的文章時,裏面講的幾乎都是 Go 語言對關鍵特性的缺失,好比泛型。我卻是認爲沒有泛型沒什麼影響——你會發現,使用map和切片(Slice)就能實現多得驚人的操做。可是我在使用 Go 語言的過程當中遇到了不少其餘問題。
首先,Go 語言多是我用過的語言裏最「執拗」的語言了。好比,它除了會強迫你使用 tab 而不是空格鍵縮進(假設你用了 gofmt 工具),會強迫你使用特定的文件組織結構,還會強迫你在 GOPATH 環境變量中編程,如此等等。這種語言有太多難以改變的特性了。Go 語言簡單易學的緣由之一恐怕就是你不能改變這些特性。若是你不肯意將全部首字母大寫的變量名 export 一遍,那真是抱歉了。幸運的是,Go 的這些特性卻是沒有觸犯個人原則底線,可是若是有人認爲裏面的某些要求根本沒法理喻,我也可以理解。相比之下 Python 就靈活多了。
在這方面把 Go 語言和 Python 作比較有些不公平。Go 的出現比 Python 晚不少,但當我發現有些功能 Go 竟然不支持的時候,仍是以爲很困惑。我甚至發現 StackOverflow 上不少人 po 出了本應該做爲內置功能的代碼段,並且你們都須要該功能,紛紛將代碼複製粘貼到本身的項目下。這類功能不該該嵌入到語言內部嗎?說到這裏,我想到了近幾年的兩個例子:
固然,這些問題的緣由有一部分是 Go 語言沒有泛型,另外一部分是由於 Go 的開發者們只給 Go 的標準庫中添加最最必要的功能。
這兩點我都理解,可是在遇到很小的問題卻須要本身寫代碼解決時仍是感到煩惱。但願隨着 Go 語言的發展,它的問題會變得愈來愈少。
Go 和 Python 你更喜歡誰?歡迎留言交流!
C/C++的問題:
Lua/Python的問題:
** 場景**
當時剛完成了nginx WAF模塊的開發工做,便開始着手搭建WAF的後臺管理系統。 因爲以前同事都用的fluentd做爲日誌收集組件,爲保持基礎組件的一致性,我也選擇了fluentd。 即最終架構爲fluentd->mongodb->mysql,再基於mysql作前端數據展現。 後來被坑了許屢次,就決定用Go重寫fluentd以解決下面幾個問題:
方案
事實上,這兩個項目都是爲了解決上面提到的問題。 提及來也許你不信,這兩個套代碼是我在業餘時間完成的,也就是說這根本不算在KPI以內。 其實一開始我也沒想到可以這麼快就寫得七七八八,畢竟是現學現用啊。 但實際狀況就是,我花了一週時間寫完httpmq,一個月多時間就寫好了gofluent……固然,這兩個項目還有不少不完善的地方。目前就日誌收集方案來講,我更推薦elastic/logstash-forwarder · GitHub和elastic/logstash · GitHub配合使用。
爲何選擇Golang
那麼,爲何我會選擇Golang呢?其實我在作出這個選擇以前已經花了大量時間作過詳盡調研。 國外如Google、AWS、Cloudflare、CoreOS等,國內如七牛、阿里等都已經開始大規模使用Golang開發其雲計算相關產品。 跟着世界級巨人的腳步應該不至於走錯方向,並且在學習Golang的過程當中,我也漸漸被其背後的設計哲學所折服。
另外,雲風博客中曾說過這樣一句話:
我發現我花了四年時間錘鍊本身用 C 語言構建系統的能力,試圖找到一個規範,能夠更好的編寫軟件。結果發現只是對 Go 的模仿。缺少語言層面的支持,只能是一個拙劣的模仿。
如下則是我對Golang的淺薄理解:
效果
最開始準備上線的時候其實內心挺忐忑,畢竟一旦出現故障,不只黑鍋得本身背,面子也上過不去啊。 還好結果蠻漂亮,自上線後沒出現過一次突發性BUG,下降運維難度的同時還減小了機器的負載。
總而言之,從工程的角度上來看,對於大多數後臺應用場景,選擇Golang是極爲明智的選擇。 這樣能夠很輕鬆的兼顧運行性能、開發效率及維護難度這三大讓諸多程序猿欲仙欲死的奇點。
2018 開發者生態報告:Java 最流行,Go 最有潛力,JavaScript最經常使用
最後, 我仍是建議你在這個互聯網時代裏,不要刻意追求一種語言,每一種語言都是有他的優點,選擇合適的纔是最重要的。互聯網沒有過時的技術,也沒有寒冷的冬天。咱們選擇儘量多的儲備糧食柴火。歡迎關注我微信技術號:終端研發部,id:codeGoogler。若是您遇到什麼問題,也能夠和我一塊交流~