go是一門編譯型語言,而不是基於虛擬機器的解釋型語言,不談編譯和解釋的效能問題,只是主觀情感上覺得編譯而產生的可執行程式與作業系統之間渾然天成。就好比戴套與不戴套的問題。go除了編譯型和C語言神似以外,還有著很多的共同點,都說go就是c的加強版,因此我覺得go應該會受到很多c語言程式員的青睞,至少我是沒hold住了。python是我認為和c一樣簡潔優雅的語言,可惜我實在不喜歡動態類型,壞處就不多說了; go號稱有著python的開發效率,但卻採用了和c一樣的靜態強型別,並且不支援類型強制轉換,不虧是c語言的加強,安全性在語言層面終於進行了嚴格的保證。
go內建了string, array, map甚至是指標等類型,滿足了C語言玩家對指標的依賴的同時也方便了程式的開發。提供了較完善的基礎類型系統,給開發確實能夠帶來很高的效率。除了完善類型系統外,還提供了簡單的封裝,實現物件導向編程,這一切都是在語言層面得到的支援,而不是自己蹩足的用C語言進行物件導向編程。時至今日,物件導向的價值還不是那麼明顯,特別是java,c++等提供了龐大的語言系統,各種介面,各種繼承,抽象不斷,太容易導致過度設計;
但go語言提供的是只是最基本的對象封裝,沒有那些複雜的特性,你想過度設計都難。
go引入了包管理機制,和java一樣,這將方便程式員進行模組化開發。雖然,C語言資深玩家也能用c語言進行模組化系統設計,但對於一個新手來說,這無疑有一定的難度。而go語言引入的包機制則在語言層面為你提供了模組化編程的思想。
Python有一個tuple類型,這個類型的一個明顯好處是讓函數支援多傳回值。一直很疑惑C/C++, java等傳統語言一開始都不支援多傳回值,難道真是緊跟數學模型y = f(x)的結果嗎?如此優秀的特性,go語言當然沒有放過,粗略的看了一下go項目中提供的庫,發現多傳回值的一個重要應用是讓函數返回的計算結果和error分離。一個c函數經常做的事情是,傳回值為正數就是真正需要的結果,如果為-1就是Function Compute過程發生錯誤了;而java函數則是計算過程發生錯誤就向外拋出異常,終止計算。c和java都不夠完美,c顯得太弱了,java顯得太臃腫了。異常機制真是一個非常土憋的技術,話說C++程式員就很少使用異常,而java程式員確是樂此不疲,結果就是代碼嵌套層次慘不忍睹。
c語言程式員可能最痛苦的是記憶體管理問題,漏掉記憶體釋放導致記憶體流失的c系統也時常發生。go既然是c的加強,因此就實現了gc,程式員再也不為記憶體流失而頭大了。
除了這些語言級的優秀特性外,go最大的亮點還是它對並行程式的支援,c/java等語言都是通過線程來實現並行,語言本身不支援並行; 而Ada這門古老語言卻早早就實現了語言級的並行了。go的並行化技術稱為goroutine,因此go中沒了線程的概念,這讓程式員能夠更加方便的正確的寫出針對多核的程式。
最後附上雕梁在google+上說的一句話——“小的語言,大的庫才是王道”。