golang初體驗

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

前幾天看了雲風關於 golang 的部落格,勾起了我對 golang 的極大興趣。
所以就趁這兩天抽空,斷斷續續把七牛許式偉的 《Go語言編程》看完了,感覺特別過癮。
golang 這門語言設計得非常簡單,但是閃光點卻很多,而且都很合我的胃口,我甚至覺得所有 C++ 程式員都沒有理由去討厭 golang(當然如果死活不肯接受 golang 代碼風格的話,那確實沒辦法)。
所以在此零碎記錄幾個非常喜歡的特性吧。

【函數多傳回值】

經常寫代碼的人都知道,對於函數多傳回值的需求一直都有。
在 C++ 中,解決方案一般是傳入多個引用作為函數參數,或者將這多個參數封裝成 struct 類型,然後再傳入,使用引用是為了減少拷貝開銷。
當 struct 這個類型拷貝代價小的時候,可以不在參數裡面傳入引用,而是直接作為函數傳回值返回。
在 STL 裡面,對於 map 的 insert 函數,就可以注意到該函數的傳回值其實就是兩個,用 pair<Iterator, bool> 封裝起來的。
而 golang 從語言層面上直接解決了這個痛點,舒服而簡單。再也不用為了返回多個值而專門定義 struct 了。

【花括弧等風格的統一】

記得兩年前第一次瞭解 golang 的時候,會覺得 golang 太自大了,把花括弧的風格都定死了。
但是經過工作中不斷因為風格不統一而導致得種種不和諧的事情之後,開始明白規範統一是為了更高效的協作。
可能很多人會拿 google 編碼規範來說事,當然,如果全世界都是遵守同一份規範的話,那確實沒有問題。但是實際上很難讓全世界都遵守。
從此我深刻理解到從語言層面定死這種寫法,會帶來無限的便利。再也不需要為一些風格引起不必要的溝通代價。

【包管理】

如果沒有包管理,那 golang 不可能敢自稱為現代化的語言,在我看來,對於新型語言,包管理幾乎就是標配。
享受過包管理的便利的人,是不可能再想回到以前那個自己拷貝代碼自己適配的古老方式。
至今用過最好的包管理是 nodejs 的 npm, 沒有之一。還沒仔細用 golang 的包管理髮布過代碼。但是相信golang 的包管理應該也不差。

【介面是非侵入性的】

對於濫用 OOP 的行為,我簡直是再討厭不過了。OOP 的思想我個人覺得只有介面和封裝是精髓。
而繼承就是花拳繡腿,每本介紹繼承的書裡面都要說什麼鳥會飛,麻雀是鳥,所以會飛之類的看上去頭頭是道的學院派例子。
但是在實際應用中,濫用繼承幾乎就是整個項目的癌症。
而 golang 中對於介面的設計非常簡潔,耳目一新,拋棄了亂七八糟的整合,只保留和 OOP 的介面和組合。
而且,對於介面也設計成非侵入性的,也就是使用介面不需要整合該介面,只需要實現了該介面定義的那些函數即可。
非常符合直覺,漂亮的避免項目因為濫用各種介面和繼承導致可讀性極差的問題。

【defer 關鍵字】

defer 這個語句我再喜歡不過了,在 C 語言中,資源銷毀或者記憶體回收一直都是很蛋疼的問題。
經常有人在函數開頭寫了 new ,然後再末尾寫了 delete,或者是 open 和 close 等 。
剛開始還好好的,但是在需求變了的時候,一著急,在函數的中間當發生某些異常時,寫了 return 來終止函數。
此時就會發生記憶體泄露等事故。
對於此,C++ 的解決方案是用解構函式來解決。反正不管函數在哪裡結束,對象的解構函式都會自動調用,也就防止此類低級錯誤的發生。
但是在 golang 裡面,拋棄了建構函式和解構函式。其實很多喜歡 C語言的人,都會覺得 C++ 的建構函式和解構函式太臃腫。
但是C語言本身沒有解構函式的支援,對於資源的回收又必須要小心翼翼,一不小心就會犯錯。
所以在此 golang 的 defer 很明顯解決的 C語言的痛點,也無愧為自稱的“更好的C語言”,至於和 C++ 的解決方案(解構函式)孰優孰劣,就沒有那麼懸殊了。

【並發相關的 (go, chan, select) 關鍵字】

在多核時代,多線程等並發編程技術幾乎成了每個後台服務工程師的標配技術。
golang 的作者明顯深明此道,索性直接從語言層面上直接支援並發。
對於此我只想說:幹得漂亮。
go 來操作協程,再也不需要為了簡單的並發運行某函數需要各種庫和繼承的囉嗦代碼了。 chan 可以類比為 C/C++ 裡安全執行緒的 blockingqueue 。
select 就是 C/C++ 裡面經常使用到的 (select/poll/epoll) 的同類產品。這三個關鍵字大大簡化了並發編程的心智勞損,實在是神來之筆。

【總結】

很明顯的是, golang 的設計者對於軟體開發經驗實在豐富,而且屬於實戰派的軟體工程師。
從 golang 中一些語言層面設計和其他主流語言不一樣的地方就可以看出,作者是非常用心的講究軟體工程體系。
如果是從 python 等語言轉過來學習 golang 的工程師,可能第一感覺會覺得 golang 語言奇怪得不可接受。
但是如果是從 C/C++ 出身的工程師來說,golang 無疑是一門非常讓人愉悅的語言。
至少對於我來說,golang 一直在解決的就是在 C/C++ 軟體開發工程中的各種痛點。
而且解決得非常漂亮。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.