我努力尊重每個人的個人喜好,因此我通常會避免爭論哪種語言是最佳的編程語言,文本編輯器或操作系統。
但是,最近有幾次我被問到為什麼我喜歡並使用很多Go,所以這裡有一篇連貫的文章來填補我的即席親自雜談的空白:-)。
我的背景
我已經在許多體面的項目中使用了C和Perl。我用Python,Ruby,C ++,CHICKEN Scheme,Emacs Lisp,Rust和Java(僅適用於Android)編寫程序。我了解一些Lua,PHP,Erlang和Haskell。在前世,我使用Delphi開發了許多程序 。
1.清晰度
格式設定
按照慣例,使用該gofmt工具格式化Go代碼 。以編程方式格式化代碼不是一個新主意,但是與它的前輩相反,它僅gofmt支持一種規範樣式。
以相同的方式格式化所有代碼,使閱讀代碼更容易。該代碼感覺很熟悉。這不僅在閱讀標準庫或Go編譯器時有所幫助,而且在處理許多代碼庫(例如開源或大公司)時也有幫助。
此外,自動格式化在代碼檢查期間可以節省大量時間,因為它消除了以前可以檢查代碼的整個維度:現在,您只需讓您的持續集成系統驗證不會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閑暇頻道時我們為他們提供的初學者資源。
注意事項
當然,沒有編程工具是完全沒有問題的。鑒於本文解釋了為什麼Go是我最喜歡的編程語言,因此將重點放在積極方面。不過,我會順便提及一些問題:
- 如果使用不提供穩定API的Go軟體包,則可能要使用特定的已知工作版本。最好的選擇是dep工具,在撰寫本文時,它不屬於該語言的一部分。
- 慣用的Go代碼不一定會轉換為性能最高的機器代碼,並且運行時要付出(小的)代價。在極少數情況下,我發現缺乏性能,因此我成功地求助於cgo或彙編程序。但是,如果您的域是硬實時應用程序或其他對性能至關重要的代碼,那麼您的工作量可能會有所不同。
- 我寫過Go標準庫是我見過的最好的庫,但這並不意味著它沒有任何問題。一個示例是在通過標準庫最舊的軟體包之一以編程方式修改Go代碼時對注釋的複雜處理go/ast。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/274940.html
微信掃一掃
支付寶掃一掃