做者介紹:程序員
Nick Cameron,PingCAP 研發工程師,Rust 語言核心成員。golang
感謝 Rust 語言中文社區夥伴們的翻譯和審校:編程
翻譯:尚卓燃數組
審校:吳聰、張漢東安全
整體印象微信
nil
:像 Rust 和 Swift 這樣的語言已經去除了
null
的概念,而且消除了相關的一整類錯誤。Go 下降了一部分風險:沒有空值(no null values),在
nil
和
0
之間進行區分。但其核心思想仍未改變,一樣還會出現解空指針引用這種常見的運行時錯誤。
易學性併發
Go 很精簡。不少語言都試圖讓本身看起來小巧,但 Go 真正作到了這一點(這基本上是一件好事,我對這種自律精神印象深入)。app
標準庫很出色(一樣,也很小)。從生態系統中尋找並使用庫程序很是容易。函數
幾乎沒有其餘語言中所不具有的東西。Go 從其餘既存語言中提取了不少內容,並進行完善,最後將它們很好地組合在一塊兒。它在避免標新立異這一方面作了極大努力。工具
乏味的樣板式代碼
if err != nil { return err }
這樣的樣板式代碼甚至比那些真正有價值的代碼還要多。
我喜歡的東西
編譯時間:絕對快,能夠肯定要比 Rust 快得多。但實際上,它並無我預期的那麼快(對於中型到大型項目,我感受它的速度只是與 C/C++ 相接近,或者稍微快一點。而我更加期待可以即時編譯)。
協程(goroutine)和信道(channel):值得稱讚的是,Go 爲生成協程和使用信道提供了輕量級的語法。儘管只是一個小細節,卻使 Go 的併發編程體驗比其餘語言更優越,它真正揭示了語法的力量。
接口:它們並不複雜,可是很容易理解和使用,而且在不少地方都很實用。
if ...; ... { }
語法:能夠將變量的做用域限制在if
語句真的很好。這與 Swift 及 Rust 中的if let
起着類似的效果,但用途更爲普遍(Go 沒有像 Swift 和 Rust 那樣的模式匹配,因此它沒法使用if let
)。測試和文檔註釋都很容易使用。
Go 工具鏈很是友好:將全部東西都放在一個地方,而不須要在命令行上使用多個工具。
擁有垃圾收集器(GC):不用考慮內存管理真的會使編程更加輕鬆。
可變參數。
我不喜歡的東西
nil
切片:要知道nil
、nil
切片和空切片三者都不相同,我敢保證咱們只須要其中的兩個,而不須要第三個。枚舉類型並非第一公民:使用常量模擬枚舉讓人感受是一種倒退。
不容許循環引用:這實際上限制了包在劃分項目模塊中的可用性,由於它變相鼓勵了在一個包中堆積大量文件(或擁有大量零碎的小包,若是本該放在一塊兒的文件四處分散,這也一樣糟糕)。
switch
容許出現遺漏匹配的狀況。for ... range
語句會返回一對「索引/值」。要想只獲取索引很容易(忽略值就好);但若要只獲取值,則須要顯式聲明。在我看來,這種作法更應該顛倒過來,由於在大多數狀況下,我更須要值而不是索引。語法:
定義與用途存在不一致。
編譯器有時會很挑剔(例如,要求或禁止尾隨逗號);經過良好的工具能夠緩解這種困擾,可是有時仍然會產生一些惱人的額外步驟。
使用多值返回類型時,類型上須要括號,但
return
語句中卻不須要。聲明一個結構體須要兩個關鍵字(
type
和struct
)。採用大寫命名法來標記公共或私有變量,看起來就像匈牙利命名法那樣,但更糟糕。
隱式接口。我知道它也出如今我喜歡的東西中,但有時候它確實很惹人煩——特別是當你試圖找出全部實現該接口的類型,或者哪些接口是爲給定類型而實現的時候。
你沒法在不一樣的包中編寫帶有接收器的函數,因此即便接口是「鴨子類型」的,你也不能爲其餘包中的類型實現這個接口,這使得它們的用處大大下降。
一致性
返回多個值和信道的語法很棒,可是這兩個沒法一塊兒使用,由於沒有元組類型。
可以用
for ... range
語句對數組和切片進行迭代,但對其餘集合就無能爲力了,由於它缺少迭代器的概念。像
len
或者append
這樣的函數是全局函數,但你本身的函數卻沒法轉變成全局函數。這些全局函數只能使用內置類型。即使 Go「沒有泛型」,它們也能夠變得通用。沒有運算符重載,那麼
==
就會令人感到惱火。由於這意味着你不能在詞典中使用自定義類型做爲鍵,除非它們是可比較的。這一屬性派生自類型結構,程序員沒法重寫該屬性。
總結
本文分享自微信公衆號 - GoCN(golangchina)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。