這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Go是Google開發的一種編譯型,並髮型,並具有記憶體回收功能的程式設計語言。羅伯特·格瑞史莫(Robert Griesemer),羅勃·派克(Rob Pike)及肯·湯普遜於2007年9月開始設計Go語言,[1],稍後Ian Lance Taylor, Russ Cox加入專案中。
Go語言這個出自大公司Google的大牛的作品, 為什麼沒有象出自Microsoft的anders hejlsberg的C#這麼吸引人併流行起來呢?其實Go語言的設計者也是有名的大牛,但為什麼三個臭皮匠,竟然抵不過一個諸葛亮呢.本人以初學者第一次接觸Go語言來說說粗淺的看法.
package main import "fmt" func main() { fmt.Println("Hello, World")}
看上面這個Hello world.首先這就有問題.Go號稱是最接近C但目標是取代C的.但這個名家之手的東西,以本人初學者來看就有兩大問題.
1.沒有標點符號,文法很接近C,但沒有符號,這就象我們寫文章,讀慣了帶逗號句號的,突然有個東西號出來的都沒有,會很不習慣.這代碼乍一看還以為蹩腳C入門者寫Hello world.給寫錯了.
2.fmt是什麼庫?看名字是看不出來的,想不到大牛對於命名也和初學者一樣,初學者學一門語言,一般肯定先從Hello world.入手,從控制台輸出入手.這給初入門學習者開了個壞頭.
以Wiki例子
package main import ( "os" "flag" // command line option parser) var omitNewline = flag.Bool("n", false, "don't print final newline") const ( Space = " " Newline = "\n") func main() { flag.Parse() // Scans the arg list and sets up flags var s string = "" for i := 0; i < flag.NArg(); i++ { if i > 0 { s += Space } s += flag.Arg(i) } if !*omitNewline { s += Newline } os.Stdout.WriteString(s)}
先以初學者的感覺來看,首先,所謂初學者,在當代其實大多數都知道點C, C++或別的什麼,因為學校裡就有這課程.然後再來年上面這堆代碼.直覺告訴我,這很象一個C或C++或什麼的初學者寫出的,不注重文法,錯誤百出的代碼.因為一般初學者喜歡兩件事,一是忘記文法的哪些地方要括弧哪些地方不加.還有就是標點符號.
當然這也許就是設計者大牛們考慮到的因素,乾脆就不需要了.但問題來了,如果你寫慣C類代碼,再來寫它或看它會感覺不太適應,然後再切回C類也一樣.糾結於標點符號.這一點上,Python也是一樣的,但Python通過空格強制,起碼讓你不會認為在寫C類程式.
var s string = "" 這樣的變數定義, 不太理解為什麼要這麼做,從初學者的角度就是不容易理解.當然對於直接沒接觸過任何程式設計語言的人除外.
for i := 0 同樣變數定義和指派陳述式,這個:=是怎麼回事?為什麼和上面的變數定義不一樣?從初學者的角度就是不容易理解.當然對於直接沒接觸過任何程式設計語言的人除外.
從文法層面,未經仔細考慮使用者感受的設計,讓使用者產生淩亂的感覺.這讓人想到了windows8的Start鍵.或許這是一種更優秀的設計,但一開始的確不順手.
當然,Go提供了一些新的理念,比如以組合為範式,簡單的說,只要是方法簽名相同,就可以當成介面,這倒是一個不錯的想法,動態語言就是這麼乾的.C#的delegate和interface也是這麼乾的.但不同.GO做這些都是隱式的.(也許這裡表達的不準確,因為沒有仔細看過go語言)
以本人的初淺觀點來看,Go語言未能仔細設計語言的表達,一開始就犯下很多初學者的錯誤,功能再強,讓Hello world這樣的程式就阻擋了人的學習慾望.也許將來有那麼一天,Go大放異彩,讓人克服入門的小問題而去使用它.