你所不知道的 Go 語言的一些令人驚歎的優點

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-advantage/1.png)> 插圖來自 https://github.com/ashleymcnamara/gophers在這篇文章中,我將會討論為什麼你應該嘗試下 Go 語言,並且應該從哪裡開始下手。Golang 是一種程式設計語言,在過去的幾年中你可能聽說過很多。儘管是在 2009 年建立的,但是近年來才開始流行。![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-advantage/2.png)> 是根據 Google Trends 得出的 Golang 的流行程度本文不是關於你通常看到的 Go 的主要賣點。相反,我想向你介紹一些相當小但仍然很重要的功能,你只有在決定嘗試 Go 之後才能瞭解到這些功能。這些令人驚歎的特性沒有浮於表面,它們可以為你節省大量的工作。它們還可以使軟體開發更加愉快。如果 Go 對你來說是新事物,別擔心。本文不需要任何 Go 語言經驗。如果你想瞭解更多,我已經在文章底部添加了一些額外的連結。我們將會涉及以下主題:- GoDoc- 靜態程式碼分析- 內建的測試和效能分析架構- 競爭條件檢測- 學習曲線- 反射- 固定的代碼風格- 文化請注意,列表不遵循任何特定的順序。完全隨意排序。## GoDocGo 非常重視代碼中的文檔。在 Go 中,文檔也很容易添加。[GoDoc](https://godoc.org/) 是一個靜態程式碼分析工具,可以直接從你的代碼中建立出漂亮的文檔頁面。關於 GoDoc 的一個值得注意的事情是,它不使用任何額外的語言,就像 JavaDoc,PHPDoc 或 JSDoc 在代碼中的注釋結構一樣。僅僅只使用英語。它儘可能多的使用從代碼中擷取的資訊,來構建文檔的輪廓,結構化和格式化文檔。它具有所有的花裡胡哨的東西,比如交叉引用,程式碼範例和直接連結到版本控制系統庫。所有你能做的就是添加一個好的 `// MyFunc transforms Foo into Bar` 注釋,這也將會在文檔中體現出來。你甚至可以添加[程式碼範例](https://blog.golang.org/examples),它可以通過 Web 介面或在本地**實際運行**。GoDoc 是整個社區使用的唯一的 Go 文檔引擎。這意味著用 Go 編寫的每個庫或應用程式都具有相同的文檔格式。從長遠來看,它幫你節省了大量瀏覽這些文檔的時間。舉個例子,這是我最近實現的樣本項目的 GoDoc 頁面:[pullkee — GoDoc](https://godoc.org/github.com/kirillrogovoy/pullkee)。## 靜態程式碼分析Go 重度依賴於靜態程式碼分析。例如,包括用於文檔的 [godoc](https://godoc.org/),用於代碼格式化的 [gofmt](https://golang.org/cmd/gofmt/),用於代碼風格檢查的 [golint](https://github.com/golang/lint),以及許多其他的例子。有這麼多的工具,甚至有一個叫 [gometalinter](https://github.com/alecthomas/gometalinter#supported-linters) 的項目,能夠把所有的工具打包組合成一個單一的工具。這些工具通常作為獨立的命令列應用程式來實現,並可以輕鬆地整合到任何編碼環境。靜態程式碼分析實際上並不是現代編程中的新東西,但是 Go 把它用到了極致。我不能高估它為我節省了多少時間。另外,它會給你一種安全的感覺,好像有人在你的背後替你遮擋風雨。建立自己的分析工具非常容易,因為 Go 有專門的內建軟體包可以用來解析和處理 Go 原始碼。你可以從這個演講中瞭解更多:[GothamGo Kickoff Meetup: Go Static Analysis Tools by Alan Donovan.](https://vimeo.com/114736889)## 內建的測試和效能分析架構你有沒有試過為一個從頭開始的 Javascript 項目選擇一個測試架構?如果是這樣,你可能會明白,經曆這樣一個分析癱瘓的鬥爭。你也許已經意識到你並沒有使用你所選擇架構的 80%。一旦你需要做一些可靠的分析,這個問題就會重複出現。Go 提供了一個內建的測試載入器,旨在簡化和高效。它為你提供了最簡單可用的 API,並做出了最小的假設。你可以將其用於不同類型的測試,分析,甚至提供可執行檔程式碼範例。它開箱即用,能夠產生了 CI 友好的輸出,使用方法通常和運行 `go test` 一樣簡單。當然,它也支援進階功能,如並行運行測試,標記跳過,等等。## 競爭條件檢測你可能已經知道 Goroutines,它在 Go 中用於實現並發代碼執行。如果你還不瞭解它,[這裡](https://gobyexample.com/goroutines)有一個非常簡短的解釋。在複雜的應用程式中進行並發編程並不容易,不管具體的技術如何,部分原因在於競爭條件的可能性。簡而言之,當多個並行作業以不可預知的順序完成時,競爭條件就會發生。這可能會導致大量的錯誤,特別難以追查。有沒有花了一天的時間去調試一個只能執行大約 80% 情況的整合測試呢?這可能是一個競爭條件。所有這一切表明,並發編程在 Go 中非常受重視,幸運的是,我們有相當強大的工具來捕捉這些競爭條件。它被完全整合到 Go 的工具鏈中。你可以在這裡閱讀更多關於它的資訊,並學習如何使用它:[Introducing the Go Race Detector — The Go Blog.](https://blog.golang.org/race-detector)## 學習曲線你可以在一個晚上學習完 Go 語言的所有功能。我是認真的。當然,還有標準庫,以及不同的,更具體的領域的最佳實務。但是,兩個小時完全足夠讓你自信地寫出一個簡單的 HTTP 伺服器或命令列應用程式。這個項目有[非常棒的文檔](https://golang.org/doc/),大部分的進階主題已經被他們的部落格所覆蓋:[The Go Programming Language Blog](https://blog.golang.org/)。Go 比 Java(和它的家族成員),Javascript,Ruby,Python 甚至 PHP 更容易在你的團隊普及。Go 的開發環境很容易設定,你的團隊只需要做很小的投資,就能完成你的第一個產品代碼。## 反射代碼反射本質上是一種能力,可以潛藏在螢幕下方,訪問有關語言結構的各種元資訊,如變數或函數。鑒於 Go 是一種靜態類型的語言,當涉及更鬆散的類型抽象編程時,它會受到各種限制。特別是與 Javascript 或 Python 等語言相比。而且,Go [沒有實現一個被稱為泛型的概念](https://golang.org/doc/faq#generics),這使得以抽象的方式處理多種類型更具挑戰性。然而,由於泛型帶來的複雜性,許多人認為這對語言實際上是有益的。我完全同意。根據 Go 的設計哲學理念(這本身是一個獨立的話題),你應該盡量不要過度設計你的解決方案。這也適用於動態類型編程。儘可能地堅持使用靜態類型,當你明確知道你正在處理什麼類型時使用介面。在 Go 中,介面非常強大,無處不在。但是,仍然有些情況下你不可能知道你所面對的是哪種資料。JSON 就是一個很好的例子。你可以在應用程式中來迴轉換所有類型的資料。字串,緩衝區,各種數字,嵌套結構等等。為瞭解決這個問題,你需要一個工具來檢查運行時的所有資料,根據資料類型和結構的不同而採取不同的行為。反射能夠協助你!Go 有一個一等公民的反射包,它使你的代碼可以是動態,就像 JavaScript 這樣的語言。一個重要的警告是要知道你使用它付出了什麼樣的代價 -- 只有在沒有簡單的方法時才使用它。你可以在這裡讀到更多關於它的內容:[The Laws of Reflection — The Go Blog.](https://blog.golang.org/laws-of-reflection)你也可以在這裡閱讀 JSON 包原始碼中的一些真實代碼:[src/encoding/json/encode.go — Source Code](https://golang.org/src/encoding/json/encode.go)## 固定的代碼風格順便說一句,有這樣一個詞嗎?在 Javascript 的世界裡,我面臨的最艱巨的事情之一是決定我需要使用哪些約定和工具。我應該如何格式化My Code?我應該使用什麼測試庫?我應該怎麼去設計結構?我應該依靠什麼樣的編程模式和方法?有時這些東西基本上讓我卡住了。我不得不做這些事情,而無法把時間花在寫代碼、滿足使用者需求上。首先,我應該注意到,我完全知道這些公約應該來自哪裡。這總是來自你和你的團隊。無論如何,即使是一群經驗豐富的 Javascript 開發人員也可以很容易地發現自己使用完全不同的工具和約定,來達到相同的結果。這使得在整個團隊中分析定位問題很困難,也使得每個人難以互相合作。但是,Go 是不同的。你只有一份每個人都必須遵循的代碼風格指南。你只有一個內建於基本工具鏈中的測試架構。關於如何構建和維護代碼,你有很多強烈的意見。如何選擇名稱。遵循什麼樣的結構化模式。如何更好地執行並發。雖然這可能看起來過於嚴格,但這能夠為你和你的團隊節省了大量的時間。當你編碼時,有些限制是一件很好的事情。在構建新的代碼時,它給了你一個更直接的方法,並且更容易理解現有的代碼。因此,大部分 Go 項目看起來都非常相似。## 文化人們都說,每當你學習一種新的口語時,你也會受到說這種語言的人的文化的部分熏陶。因此,你學習的語言越多,你可能受到的更多的個人改變。這與程式設計語言是一樣的。無論將來使用何種新的程式設計語言,它總是會給你一個關於編程的新觀點,或者一些特定的技術。無論是函數式編程,模式比對還是原型繼承。一旦你掌握了這些知識,就可以隨身攜帶這些方法,從而拓寬了你作為一個軟體開發人員解決問題的工具。通常來說它也改變了你看待高品質編程的方式。Go 是一個很好的投資機會。Go 文化的主要支柱是保持簡單實用的代碼,而不會產生多餘的抽象,並且非常重視代碼的可維護性。能夠把大量時間用在實現業務代碼上,而不是用來修改工具和配置環境,這也是文化的一部分。或者在不同的變體之間進行選擇。Go 也可以總結為“應該只有一個方法來完成一件事情”。一個小方面的說明。當你需要構建一個相對複雜的抽象時,用 Go 通常不是那麼好實現的。對於這點,這應該是 Go 語言簡單性的一種代價。如果你真的需要編寫大量的具有複雜關係的抽象代碼,最好使用像 Java 或 Python 這樣的語言。但是,即使真的有需要,這種情況也是非常罕見的。始終使用最好的工具來完成工作!## 總結你以前可能聽說過 Go。或者也許它一直不在你的使用範圍之內。無論哪種方式,Go 可以是你或你的團隊在開始新項目或改進現有項目時一個非常體面的選擇。這並不是關於 Go 的所有令人驚歎的優點的完整列表。**僅僅只是被低估的部分。**請嘗試一下 Go 語言,[A Tour of Go](https://tour.golang.org/) 是一個很好的開始學習的地方。如果你想瞭解更多關於 Go 的好處,你可以看看這些連結:- [Why should you learn Go? — Keval Patel — Medium](https://medium.com/@kevalpatel2106/why-should-you-learn-go-f607681fad65)- [Farewell Node.js — TJ Holowaychuk — Medium](https://medium.com/@tjholowaychuk/farewell-node-js-4ba9e7f3e52b)在評論中分享你的學習結果!即使你沒有在專門尋找一種新的語言,花一兩個小時的時間瞭解下 Go 也是值得的。也許在未來可能會變得對你非常有用。持續不斷的尋找最適合你的開發工具!* * *如果你喜歡這篇文章,請考慮關注我的更多內容,並點擊這些文本下面的那些有趣的綠色小手來分享。

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

作者:Kirill Rogovoy 譯者:MDGSF 校對:rxcai

本文由 GCTT 原創編譯,Go語言中文網 榮譽推出

本文由 GCTT 原創翻譯,Go語言中文網 首發。也想加入譯者行列,為開源做一些自己的貢獻嗎?歡迎加入 GCTT!
翻譯工作和譯文發表僅用於學習和交流目的,翻譯工作遵照 CC-BY-NC-SA 協議規定,如果我們的工作有侵犯到您的權益,請及時聯絡我們。
歡迎遵照 CC-BY-NC-SA 協議規定 轉載,敬請在本文中標註並保留原文/譯文連結和作者/譯者等資訊。
文章僅代表作者的知識和看法,如有不同觀點,請樓下排隊吐槽

1290 次點擊  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.