當前位置:
首頁 > 最新 > Go語言中那些你未曾聽說過的驚人優點

Go語言中那些你未曾聽說過的驚人優點

在過去的幾年裡你可能多次聽到 Go 這門編程語言。儘管它的歷史能夠追溯到 2009 年,但是在最近的幾年它的人氣才開始飆升。

這篇文章並不介紹 Go 語言中那幾個你經常看到的賣點。

相反,我將向你展示 Go 裡面那些微小但意義非凡的特性,這些特性只有你在決定嘗試 Go 之後才能了解到。

這些令人驚嘆的特性在表面上看毫不起眼,但卻能實實在在得幫你節省數周或者數月的工作量,讓開發者更多地享受到軟體開發的樂趣。

如果你是一個 Go 語言的新手,也請不用擔心,這篇文章不需要任何與 Go 相關的語言知識。同時我也在文章的底部添加了幾個鏈接,以便讓你學習更多的內容。

接下來我們將會閱讀到以下幾個主題:

GoDoc

靜態代碼分析

內置的測試和性能分析框架

競態條件檢測

學習曲線

反射

偏執

文化

請注意,上面的列表並不遵循任何特定的順序。

GoDoc

Go 非常重視代碼中的文檔,所以編寫Go語言項目的文檔非常簡單。

GoDoc是一個靜態代碼分析工具,可以直接通過你的代碼生成美觀的文檔頁面。GoDoc 一個卓越的地方在於,你不需要在代碼中像 JavaDoc、PHPDoc 或者 JSDoc 那樣使用額外的語法來構建注釋,一切都是英文。

它通過在代碼中獲取儘可能多的信息,然後來構建大綱、結構以及對文檔做格式化。它也具有所有花里胡哨的功能,例如交叉引用、示例代碼等,而且能夠直接鏈接到你的版本控制系統的倉庫里。

所有你能做的就是添加一個優質的注釋,例如,它們將會被引用到文檔里。你甚至能夠添加示例代碼,然後在Web介面或者本地運行。

GoDoc 是整個 Go 社區唯一使用的文檔引擎。這意味著所有 Go 編寫的庫或者應用程序都擁有相同文檔格式。從長遠來看,瀏覽這些文檔時可以節省大量的時間。

這裡有個例子,我最近的寵物項目的 GoDoc 頁面:pullkee?—?GoDoc.

靜態代碼分析

Go 非常依賴靜態代碼分析。包括用於文檔的godoc、代碼格式化的gofmt、代碼風格標記的golint,還有其他更多的例子。

有個叫做gometalinter的項目,將上面提到的這類程序組合成一個單獨的工具。

這些工具大多都實現為獨立的命令行應用程序,並且能夠很容易得與任何開發環境整合在一起。

靜態代碼分析實際上並不是現代編程的新東西,但 Go 將它更進一步。我無法估計它為我節省了多少時間。同時,它也能給你安全感,就如同有人在背後做你的後盾。

創造你自己的分析器也很簡單,Go 內置了專用的包用來分析和使用 Go 源碼。

你可以在這個 talk 中學到更多:GothamGo Kickoff Meetup: Go靜態分析工具 by Alan Donovan.

內置的測試和性能分析框架

你有沒有試過為從零開始的 Javascript 項目選擇一個測試框架?如果有的話,可能就理解選擇是多麼令人糾結了。你也許已經意識到,你所選擇的框架80%的功能你都不會用到。

當你需要做一些可靠性分析的時候,這個問題會再次出現在你面前。

Go 提供了一個內置的測試工具,旨在簡化使用流程和提高工作效率。它儘可能為您提供了最簡單的 API,並做出了最小的假設。你可以用它做各種類型的測試、性能分析,甚至提供可以運行的代碼例子。

它默認提供對 CI 友好的輸出,並且通常情況下只需要簡單得使用運行即可。當然,它也支持並行測試、跳過標記以及其他更多的高級特性。

競態條件檢測

你可能了解過 Goroutines,它用來在 Go 中實現代碼的並發執行。如果你還沒了解過,這裡有一個非常簡短的解釋。

無論使用哪種特定的技術,在複雜的程序中進行並發編程從來都不是一件容易的事,部分原因就在於可能存在的竟態條件。

簡單來說,當多個並發操作以不可預知的順序執行時,竟態條件就會發生,這可能會導致許多難以追蹤的 bug。有沒有花掉一整天的時間,去調試一個只能執行80%的集成測試的經歷?這很有可能就是竟態條件引起的。

正因為如此,在 Go 裡面並發編程是被嚴肅對待的一件事。Go 的工具鏈裡面集成了一個強有力的工具,我們可以用它來捕獲那些竟態條件。

你可以從這裡了解更多以及學習如何使用它:Go竟態條件介紹—?The Go Blog

學習曲線

我可以負責任得說,你只用一個晚上的時間就能學習完Go的所有語言特性。當然,還需要學習標準庫、在不同特定領域中的最佳實踐等,但兩個小時完全足夠你充滿自信得編寫一個HTTP服務,或者一個命令行程序。

官方提供了一份絕佳的文檔,並且大部分高級主題也在它們的博客中有過介紹

將 Go 引入你的團隊中要比 Java 系列、JavaScript、Ruby、Python、甚至 PHP 容易得多。開發環境很容易搭建,在正式代碼編寫之前你需要做的事少了很多。

反射

代碼反射本質上是一種能力,可以讓你獲得各種不同的關於語言結構的元信息,比如變數和函數。

由於 Go 是一門靜態語言,所以當涉及到更為送散的抽象編程時會受到一系列限制,尤其是和 Javascripth 或者 Python 比較時。

此外,由於 Go 沒有關於泛型的概念,使用多類型的抽象方式進行編碼時會受到更多挑戰。然而也有許多人認為,相比於因為引入泛型導致語言複雜性增加,暫時捨棄泛型對語言會更有益。我完全同意。

根據 Go 的哲學(這是另外一個獨立的話題),你應該盡量不要對你的解決方案進行過度設計。這也適用於動態語言。儘可能得使用靜態類型,並且當你知道確切的類型時則使用介面。在 Go 中介面無處不在並且非常強大。

然而,在有些情況下你無法確定正在面對哪些數據。一個典型的例子是 JSON,您需要在應用程序中來迴轉換所有類型的數據,字元串,緩衝區,各種數字,嵌套結構等等。

為了避免這一切,你需要一個工具用來檢查所有運行中的數據,然後根據其不同的類型和結構採取不同的行為。這個工具就是反射,Go 擁有一個優秀的反射包,用來讓你的代碼像 Javascript 一樣動態運行。

但是也有一個警告:你必須知道反射的代價——只有在沒有更加簡單的方法時才使用它。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Go中國 的精彩文章:

攜程AI和推薦系統的雲化實踐
beego開源之路

TAG:Go中國 |