這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
有好幾次,當我想起來的時候,總是會問自己:我為什麼要放棄Go語言?這個決定是正確的嗎?是明智和理性的嗎?其實我一直在認真思考這個問題。
開門見山地說,我當初放棄Go語言,就是因為兩個“不爽”:第一,對Go語言本身不爽;第二,對Go語言社區裡的某些人不爽。毫無疑問,這是非常主觀的結論。但是我有足夠詳實的客觀的論據,支撐這個看似主觀的結論。
第0節:我的Go語言經曆
先說說我的經曆吧,以避免被無緣無故地當作Go語言的低級黑。
2009年底,Go語言第一個公開版本發布,籠罩著“Google公司製造”的光環,吸引了許多慕名而來的嘗鮮者,我(Liigo)也身居其中,籠統的看了一些Go語言的資料,學習了基礎的教程,因對其文法中的分號和花括弧不滿,很快就遺忘掉了,沒拿它當一回事。
兩年之後,2011年底,Go語言發布1.0的計劃被提上議程,相關的報道又多起來,我再次關注它,[重新評估][1]之後決定深入參與Go語言。我訂閱了其users、nuts、dev、commits等官方郵件組,堅持每天閱讀其中的電子郵件,以及開發人員提交的每一次原始碼更新,給Go提交了許多改進意見,甚至包括[修改Go語言編譯器原始碼][2]直接參与開發工作單位。如此持續了數月時間。
到2012年初,Go 1.0發布,語言和標準庫都已經基本定型,不可能再有大幅改進,我對Go語言未能在1.0定型之前更上一個台階、實現自我突破,甚至帶著諸多明顯缺陷走向1.0,感到非常失望,因而逐漸疏遠了它(所以Go 1.0之後的事情我很少關心)。後來看到即將發布的Go 1.1的Release Note,發現語言層面沒有太大改變,只是在庫和工具層面有所修補和改進,感到它尚在幼年就失去成長的動力,越發失望。外加Go語言社區裡的某些人,其中也包括Google公司負責開發Go語言的某些人,其態度、言行,讓我極度厭惡,促使我決絕地離棄Go語言。
1: https://plus.google.com/+LiigoZhuang/posts/CpRNPeDXUDW
2: http://blog.csdn.net/liigo/article/details/7467309
第1節:我為什麼對Go語言不爽?
Go語言有很多讓我不爽之處,這裡列出我現在還能記起的其中一部分,排名基本上不分先後。讀者們耐心地看完之後,還能淡定地說一句“我不在乎”嗎?
1.1 不允許左花括弧另起一行
關於對花括弧的擺放,在C語言、C++、Java、C#等社區中,十餘年來存在持續爭議,從未形成一致意見。在我看來,這本來就是主觀傾向很重的抉擇,不違反原則不涉及是非的情況下,不應該搞一刀切,讓程式員或團隊自己選擇就足夠了。程式設計語言本身強行限制,把自己的喜好強加給別人,得不償失。無論傾向於其中任意一種,必然得罪與其對立的一群人。雖然我現在已經習慣了把左花括弧放在行尾,但一想到被禁止其他選擇,就感到十分不爽。Go語言這這個問題上,沒有做到“團結一切可以團結的力量”不說,還有意給自己樹敵,太失敗了。
1.2 編譯器莫名其妙地給行尾加上分號
對Go語言本身而言,行尾的分號是可以省略的。但是在其編譯器(gc)的實現中,為了方便編譯器開發人員,卻在詞法分析階段強行添加了行尾的分號,反過來又影響到語言規範,對“怎樣添加分號”做出特殊規定。這種變態做法前無古人。在左花括弧被意外放到下一行行首的情況下,它自動在上一行行尾添加的分號,會導致莫名其妙的編譯錯誤(Go 1.0之前),連它自己都解釋不明白。如果實在處理不好分號,乾脆不要省略分號得了;或者,Scala和JavaScript的編譯器是開源的,跟它們學學怎麼處理省略行尾分號可以嗎?
1.3 極度強調編譯速度,不惜放棄本應提供的功能
程式員是人不是神,編碼過程中免不了因為大意或疏忽犯一些錯。其中有一些,是大家集體性的很容易就中招的錯誤(Go語言裡的例子我暫時想不起來,C++裡的例子有“基類解構函式不是虛函數”)。這時候編譯器應該站出來,多做一些檢查、約束、核對性工作,盡量阻止常規錯誤的發生,盡量不讓有潛在錯誤的代碼編譯通過,必要時給出一些警告或提示,讓程式員留意。編譯器不就是機器麼,不就是應該多做髒活累活雜活、減少人的心智負擔嗎?編譯器多做一項檢查,可能會避免數十萬程式員今後多年內無數次犯同樣的錯誤,節省的時間不計其數,這是功德無量的好事。但是Go編譯器的作者們可不這麼想,他們不願意自己多花幾個小時給編譯器增加新功能,覺得那是虧本,反而減慢了編譯速度。他們以影響編譯速度為由,拒絕了很多對編譯器改進的要求。典型的因噎廢食。強調編譯速度固然值得讚賞,但如果因此放棄應有的功能,我不贊成。