首頁>技術>

我努力尊重每個人的個人喜好,因此我通常會避免爭論哪種語言是最佳的程式語言,文字編輯器或作業系統。

但是,最近有幾次我被問到為什麼我喜歡並使用很多Go,所以這裡有一篇連貫的文章來填補我的即席親自雜談的空白:-)。

我的背景

我已經在許多體面的專案中使用了C和Perl。我用Python,Ruby,C ++,CHICKEN Scheme,Emacs Lisp,Rust和Java(僅適用於Android)編寫程式。我瞭解一些Lua,PHP,Erlang和Haskell。在前世,我使用Delphi開發了許多程式 。

1.清晰度格式設定

按照慣例,使用該gofmt工具格式化Go程式碼 。以程式設計方式格式化程式碼不是一個新主意,但是與它的前輩相反,它僅gofmt支援一種規範樣式。

此外,自動格式化在程式碼檢查期間可以節省大量時間,因為它消除了以前可以檢查程式碼的整個維度:現在,您只需讓您的持續整合系統驗證不會gofmt產生差異即可。

有趣的是,gofmt儲存檔案時讓我的編輯器生效已經改變了我編寫程式碼的方式。我曾經嘗試匹配格式化程式將要執行的操作,然後讓它糾正我的錯誤。如今,我儘可能快地表達自己的想法,並相信gofmt可以使它變得漂亮(例如,鍵入內容,請單擊“格式”)。

高質量程式碼

我使用了很多標準庫(docs, source),請參見下文。

到目前為止,我閱讀的所有標準庫程式碼都是非常高質量的。

一個例子是image/jpeg程式包:當時我還不知道JPEG的工作方式,但是透過在Wikipedia JPEG文章和 image/jpeg程式碼之間進行切換很容易實現。如果該軟體包還有其他意見,我將其視為教學實施。

意見

我已經同意Go社群的許多觀點,例如:

預設情況下,變數名應該短一些,並且隨著宣告使用名稱的增加,其名稱也變得更具描述性。保持依賴性樹很小(在合理的程度):稍微複製勝於一點依賴性引入抽象層是有代價的。Go程式碼通常非常清晰,但有時會有些重複。有關更多資訊,請參見CodeReviewComments和Go Proverbs。很少的關鍵字和抽象層

Go規範僅列出了25個關鍵字,我可以很容易地記住這些關鍵字。

內建函式和 型別也是如此。

以我的經驗,少量的抽象層和概念使該語言易於學習,並很快就感到舒適。

當我們談論它時:我對Go規範的可讀性感到驚訝。它似乎真的是針對程式設計師(而不是標準委員會)。

2.速度快速反饋/低延遲

我喜歡快速的反饋意見:我希望網站能夠快速載入,我更喜歡流暢的使用者介面,它們不會滯後,而且我會每天選擇快速工具,而不是功能更強大的工具。 大型網路媒體資源的調查結果證實,此行為是許多人共有的。

Go編譯器的作者尊重我對低延遲的渴望:編譯速度對他們很重要,新的最佳化方案會仔細權衡它們是否會減慢編譯速度。

我的一個朋友以前沒有使用過Go。在使用安裝了RobustIRC橋之後編譯了下,他們得出結論,Go必須是一種解釋語言,我必須對其進行更正:不,Go編譯器就這麼快。

大多數Go工具也不例外,例如gofmt,goimports速度非常快。

最大資源使用

對於批處理應用程式(與互動式應用程式相反),充分利用可用資源通常比低延遲更為重要。

配置和更改Go程式以利用所有可用的IOPS,網路頻寬或計算非常容易。例如,我寫了有關 填充1 Gbps鏈路的資訊,並優化了debiman以利用所有可用資源,從而將其執行時間減少了數小時。

3.豐富的標準庫

在圍棋標準庫提供了手段,有效地使用公共通訊協議和資料儲存格式/機制,如TCP / IP,HTTP,JPEG,SQL,...

Go的標準庫是我見過的最好的庫。我認為它組織得井井有條,乾淨,小巧而又全面:我經常發現僅使用標準庫以及一個或兩個外部程式包就可以編寫大小合理的程式。

(通常)不包含特定於域的資料型別和演算法,並且不在標準庫之內(例如)golang.org/x/net/html。該 golang.org/x名稱空間還用作新程式碼的臨時區域進入標準庫前:轉到1相容性保證,排除了任何重大的變動,即使他們顯然是值得的。一個著名的例子是 golang.org/x/crypto/ssh,它必須破壞現有程式碼以建立更安全的預設值。

4.工具

要下載,編譯,安裝和更新Go軟體包,我使用了該go get工具。

我使用過的所有Go程式碼庫都使用內建 testing功能。這不僅可以輕鬆快速地進行測試,還可以輕鬆獲得覆蓋率報告。

每當程式使用比預期更多的資源時,我就會啟動pprof。請參閱此golang.org部落格文章 pprof以獲取介紹,或 參閱我的部落格文章關於最佳化Debian Code Search。匯入net/http/pprof 軟體包後,您可以在伺服器執行時對其進行概要分析,而無需重新編譯或重新啟動。

交叉編譯就像設定GOARCH環境變數一樣容易,例如GOARCH=arm64,針對Raspberry Pi3。值得注意的是,工具也可以跨平臺工作!例如,我可以 從amd64計算機上分析gokrazy:go tool pprof ~/go/bin/linux_arm64/dhcp http://gokrazy:3112/debug/pprof/heap。

godoc將文件顯示為純文字或透過HTTP提供。godoc.org是一個公共例項,但是我執行一個本地例項,以供離線使用或尚未釋出的軟體包使用。

請注意,這些是語言隨附的標準工具。來自C,以上每一項都是一項重要的成就。在Go中,我們認為它們是理所當然的。

入門

希望我能夠表達出我對使用Go感到高興的原因。

如果您有興趣開始使用Go,請檢視 當人們加入Gophers閒暇頻道時我們為他們提供的初學者資源。請參閱 https://golang.org/help/。

注意事項

當然,沒有程式設計工具是完全沒有問題的。鑑於本文解釋了為什麼Go是我最喜歡的程式語言,因此將重點放在積極方面。不過,我會順便提及一些問題:

如果使用不提供穩定API的Go軟體包,則可能要使用特定的已知工作版本。最好的選擇是dep工具,在撰寫本文時,它不屬於該語言的一部分。慣用的Go程式碼不一定會轉換為效能最高的機器程式碼,並且執行時要付出(小的)代價。在極少數情況下,我發現缺乏效能,因此我成功地求助於cgo或彙編程式。但是,如果您的域是硬實時應用程式或其他對效能至關重要的程式碼,那麼您的工作量可能會有所不同。我寫過Go標準庫是我見過的最好的庫,但這並不意味著它沒有任何問題。一個示例是在透過標準庫最舊的軟體包之一以程式設計方式修改Go程式碼時對註釋的複雜處理go/ast。

13
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 聊聊dapr的Limiter