歡迎光臨
每天分享高質量文章

你沒聽說過的 Go 語言驚人優點 | Linux 中國

在這篇文章中,我將討論為什麼你需要嘗試一下 Go 語言,以及應該從哪裡學起。
— Kirill Rogovoy


致謝
編譯自 | 
https://medium.freecodecamp.org/here-are-some-amazing-advantages-of-go-that-you-dont-hear-much-about-1af99de3b23a
 
 作者 | Kirill Rogovoy
 譯者 | imquanquan ??共計翻譯:5.0 篇 貢獻時間:282 天

在這篇文章中,我將討論為什麼你需要嘗試一下 Go 語言,以及應該從哪裡學起。

Go 語言是可能是最近幾年裡你經常聽人說起的程式語言。儘管它在 2009 年已經釋出了,但它最近才開始流行起來。

根據 Google 趨勢,Go 語言非常流行。

這篇文章不會討論一些你經常看到的 Go 語言的主要特性。

相反,我想向您介紹一些相當小眾但仍然很重要的功能。只有在您決定嘗試 Go 語言後,您才會知道這些功能。

這些都是錶面上沒有體現出來的驚人特性,但它們可以為您節省數周或數月的工作量。而且這些特性還可以使軟體開發更加愉快。

閱讀本文不需要任何語言經驗,所以不必擔心你還不瞭解 Go 語言。如果你想瞭解更多,可以看看我在底部列出的一些額外的連結。

我們將討論以下主題:

◈ GoDoc
◈ 靜態程式碼分析
◈ 內建的測試和分析框架
◈ 競爭條件檢測
◈ 學習曲線
◈ 反射
◈ Opinionatedness
◈ 文化

請註意,這個串列不遵循任何特定順序來討論。

GoDoc

Go 語言非常重視程式碼中的檔案,所以也很簡潔。

GoDoc[1] 是一個靜態程式碼分析工具,可以直接從程式碼中建立漂亮的檔案頁面。GoDoc 的一個顯著特點是它不使用任何其他的語言,如 JavaDoc、PHPDoc 或 JSDoc 來註釋程式碼中的結構,只需要用英語。

它使用從程式碼中獲取的盡可能多的資訊來概述、構造和格式化檔案。它有多而全的功能,比如:交叉取用、程式碼示例,並直接連結到你的版本控制系統倉庫。

而你需要做的只有新增一些像 // MyFunc transforms Foo into Bar 這樣子的老牌註釋,而這些註釋也會反映在的檔案中。你甚至可以新增一些透過網路介面或者在本地可以實際執行的 程式碼示例[2]

GoDoc 是 Go 的唯一檔案引擎,整個社群都在使用。這意味著用 Go 編寫的每個庫或應用程式都具有相同的檔案格式。從長遠來看,它可以幫你在瀏覽這些檔案時節省大量時間。

例如,這是我最近一個小專案的 GoDoc 頁面:pullkee — GoDoc[3]

靜態程式碼分析

Go 嚴重依賴於靜態程式碼分析。例如用於檔案的 godoc[1],用於程式碼格式化的 gofmt[4],用於程式碼風格的 golint[5],等等。

它們是如此之多,甚至有一個總攬了它們的專案 gometalinter[6] ,將它們組合成了單一的實用程式。

這些工具通常作為獨立的命令列應用程式實現,並可輕鬆與任何編碼環境整合。

靜態程式碼分析實際上並不是現代程式設計的新概念,但是 Go 將其帶入了絕對的範疇。我無法估量它為我節省了多少時間。此外,它給你一種安全感,就像有人在你背後支援你一樣。

建立自己的分析器非常簡單,因為 Go 有專門的內建包來解析和加工 Go 原始碼。

你可以從這個連結中瞭解到更多相關內容: GothamGo Kickoff Meetup: Alan Donovan 的 Go 靜態分析工具[7]

內建的測試和分析框架

您是否曾嘗試為一個從頭開始的 JavaScript 專案選擇測試框架?如果是這樣,你或許會理解經歷這種過度分析analysis paralysis的痛苦。您可能也意識到您沒有使用其中 80% 的框架。

一旦您需要進行一些可靠的分析,問題就會重覆出現。

Go 附帶內建測試工具,旨在簡化和提高效率。它為您提供了最簡單的 API,並做出最小的假設。您可以將它用於不同型別的測試、分析,甚至可以提供可執行程式碼示例。

它可以開箱即用地生成便於持續整合的輸出,而且它的用法很簡單,只需執行 go test。當然,它還支援高階功能,如並行執行測試,跳過標記程式碼,以及其他更多功能。

競爭條件檢測

您可能已經聽說了 Goroutine,它們在 Go 中用於實現併發程式碼執行。如果你未曾瞭解過,這裡[8]有一個非常簡短的解釋。

無論具體技術如何,複雜應用中的併發程式設計都不容易,部分原因在於競爭條件的可能性。

簡單地說,當幾個併發操作以不可預測的順序完成時,競爭條件就會發生。它可能會導致大量的錯誤,特別難以追查。如果你曾經花了一天時間除錯整合測試,該測試僅在大約 80% 的執行中起作用?這可能是競爭條件引起的。

總而言之,在 Go 中非常重視併發程式設計,幸運的是,我們有一個強大的工具來捕捉這些競爭條件。它完全整合到 Go 的工具鏈中。

您可以在這裡閱讀更多相關資訊並瞭解如何使用它:介紹 Go 中的競爭條件檢測 – Go Blog[9]

學習曲線

您可以在一個晚上學習所有的 Go 語言功能。我是認真的。當然,還有標準庫,以及不同的,更具體領域的最佳實踐。但是兩個小時就足以讓你自信地編寫一個簡單的 HTTP 伺服器或命令列應用程式。

Go 語言擁有出色的檔案[10],大部分高階主題已經在他們的部落格上進行了介紹:Go 程式語言部落格[11]

比起 Java(以及 Java 家族的語言)、Javascript、Ruby、Python 甚至 PHP,你可以更輕鬆地把 Go 語言帶到你的團隊中。由於環境易於設定,您的團隊在完成第一個生產程式碼之前需要進行的投資要小得多。

反射

程式碼反射本質上是一種隱藏在編譯器下並訪問有關語言結構的各種元資訊的能力,例如變數或函式。

鑒於 Go 是一種靜態型別語言,當涉及更鬆散型別的抽象程式設計時,它會受到許多各種限制。特別是與 Javascript 或 Python 等語言相比。

此外,Go 沒有實現一個名為泛型的概念[12],這使得以抽象方式處理多種型別更具挑戰性。然而,由於泛型帶來的複雜程度,許多人認為不實現泛型對語言實際上是有益的。我完全同意。

根據 Go 的理念(這是一個單獨的主題),您應該努力不要過度設計您的解決方案。這也適用於動態型別程式設計。盡可能堅持使用靜態型別,併在確切知道要處理的型別時使用介面interface。介面在 Go 中非常強大且無處不在。

但是,仍然存在一些情況,你無法知道你處理的資料型別。一個很好的例子是 JSON。您可以在應用程式中來迴轉換所有型別的資料。字串、緩衝區、各種數字、巢狀結構等。

為瞭解決這個問題,您需要一個工具來檢查執行時的資料並根據其型別和結構採取不同行為。反射Reflect可以幫到你。Go 擁有一流的反射包,使您的程式碼能夠像 Javascript 這樣的語言一樣動態。

一個重要的警告是知道你使用它所帶來的代價 —— 並且只有知道在沒有更簡單的方法時才使用它。

你可以在這裡閱讀更多相關資訊: 反射的法則 — Go 部落格[13].

您還可以在此處閱讀 JSON 包原始碼中的一些實際程式碼: src/encoding/json/encode.go — Source Code[14]

Opinionatedness(專制獨裁的 Go)

順便問一下,有這樣一個單詞嗎?

來自 Javascript 世界,我面臨的最艱巨的困難之一是決定我需要使用哪些約定和工具。我應該如何設計程式碼?我應該使用什麼測試庫?我該怎麼設計結構?我應該依賴哪些程式設計範例和方法?

這有時候基本上讓我卡住了。我需要花時間思考這些事情而不是編寫程式碼並滿足使用者。

首先,我應該註意到我完全知道這些慣例的來源,它總是來源於你或者你的團隊。無論如何,即使是一群經驗豐富的 Javascript 開發人員也很容易發現他們在實現相同的結果時,而大部分的經驗卻是在完全不同的工具和範例上。

這導致整個團隊中出現過度分析,並且使得個體之間更難以相互協作。

嗯,Go 是不同的。即使您對如何構建和維護程式碼有很多強烈的意見,例如:如何命名,要遵循哪些結構樣式,如何更好地實現併發。但你只有一個每個人都遵循的風格指南。你只有一個內建在基本工具鏈中的測試框架。

雖然這似乎過於嚴格,但它為您和您的團隊節省了大量時間。當你寫程式碼時,受一點限制實際上是一件好事。在構建新程式碼時,它為您提供了一種更直接的方法,並且可以更容易地除錯現有程式碼。

因此,大多數 Go 專案在程式碼方面看起來非常相似。

文化

人們說,每當你學習一門新的口語時,你也會沉浸在說這種語言的人的某些文化中。因此,您學習的語言越多,您可能會有更多的變化。

程式語言也是如此。無論您將來如何應用新的程式語言,它總能給你帶來新的程式設計視角或某些特別的技術。

無論是函式式程式設計,樣式匹配pattern matching還是原型繼承prototypal inheritance。一旦你學會了它們,你就可以隨身攜帶這些程式設計思想,這擴充套件了你作為軟體開發人員所擁有的問題解決工具集。它們也改變了你閱讀高質量程式碼的方式。

而 Go 在這方面有一項了不起的財富。Go 文化的主要支柱是保持簡單,腳踏實地的程式碼,而不會產生許多冗餘的抽象概念,並將可維護性放在首位。大部分時間花費在程式碼的編寫工作上,而不是在修補工具和環境或者選擇不同的實現方式上,這也是 Go 文化的一部分。

Go 文化也可以總結為:“應當只用一種方法去做一件事”。

一點註意事項。當你需要構建相對複雜的抽象程式碼時,Go 通常會妨礙你。好吧,我會說這是簡單的權衡。

如果你真的需要編寫大量具有複雜關係的抽象程式碼,那麼最好使用 Java 或 Python 等語言。然而,這種情況卻很少。

在工作時始終使用最好的工具!

總結

你或許之前聽說過 Go,或者它暫時在你圈子以外的地方。但無論怎樣,在開始新專案或改進現有專案時,Go 可能是您或您團隊的一個非常不錯的選擇。

這不是 Go 的所有驚人的優點的完整串列,只是一些被人低估的特性。

請嘗試一下從 Go 之旅[15] 來開始學習 Go,這將是一個令人驚嘆的開始。

如果您想瞭解有關 Go 的優點的更多資訊,可以檢視以下連結:

◈ 你為什麼要學習 Go? – Keval Patel[16]
◈ 告別Node.js – TJ Holowaychuk[17]

併在評論中分享您的閱讀感悟!

即使您不是為了專門尋找新的程式語言語言,也值得花一兩個小時來感受它。也許它對你來說可能會變得非常有用。

不斷為您的工作尋找最好的工具!

題圖來自 https://github.com/ashleymcnamara/gophers 的圖稿


via: https://medium.freecodecamp.org/here-are-some-amazing-advantages-of-go-that-you-dont-hear-much-about-1af99de3b23a

作者:Kirill Rogovoy[20] 譯者:imquanquan 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

贊(0)

分享創造快樂