這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
最近,在網上出現了一本名為《Go Web編程》的書籍,裡面詳細地講述了使用Go語言進行Web編程的各個方面。很特別的是,這本書是在GitHub上以開源的方式撰寫的。日前,InfoQ採訪了這本書的作者謝孟軍先生,請他來和大家談談Go語言以及他撰寫的開源書籍。
InfoQ:請您先簡單和大家介紹一下自己。
謝孟軍:大家好,我叫謝孟軍,可以叫我Asta,目前就職於盛大雲,負責盛大雲分發產品的研發。雲分發就是我們平常所謂的CDN系統。
InfoQ:是什麼原因促使您撰寫《Go Web編程》這本書呢?
謝孟軍:我以前主要從事PHP、Python等Web方面的開發,後來到了盛大雲之後接觸比較多C++等底層的東西,就想學習一下這些底層的技術。再後來看到許式偉的部落格,瞭解到Go語言。Go出自B語言的作者和Unix創始人Ken Thomson之手,而且還有多位牛人在後面支撐,該語言設計的初衷就是系統層級的語言。這正好符合我學習的目標,所以我就開始了自學之路。自學過程中發現Go在網路編程這一塊為開發人員提供了很多便利,既有C等語言的效能和排錯能力,又具備Python等語言的動態特性,還內建了對多核並發的支援。
在學習的過程中,我發現Go在網路編程方面的表現非常好,而我以前主要從事Web開發,所以就想寫《Go Web編程》這樣一本書,主要還是把以前在Web開發中的一些經驗和Go語言結合起來,做一些總結,給後來者一些啟示,希望對想學習Go語言的同學們一些協助。
InfoQ:您撰寫的這本書在GitHub上開源,為什麼會採取這樣的一種方式呢?
謝孟軍:採用GitHub主要是我之前看到過一本書叫做《PHP擴充開發及核心應用》,這本書就是在GitHub上面寫的,我看到之後很震驚,居然還可以這樣來寫書,而markdown又是如此的簡潔,GitHub對於markdown的支援也非常好,所以當初就決定在GitHub上面來寫這本書。
InfoQ:Go語言的哪些特點最吸引您?哪些特點讓您覺得需要進一步改進?
謝孟軍:Go語言吸引我的主要有如下幾點:
- 它是系統層級的語言,靜態編譯,是C系列語言。
- 具有很多內建庫,使用起來和Python很類似。
- 文法足夠簡單,入門學習成本很低,適合我這樣從PHP和Python切換過來的人。
- 速度快,就拿簡單的頁面來說,我用PHP開發並發能夠達到500很好了,但是用Go輕鬆就到上萬,這是無法比擬的效能提升,而且用Go開發的效率和PHP差不多。
- 出自Google之手,而且有一幫牛人在維護,基於BSD開源,社區活躍。
- 開源項目給我很多自信,舉幾個開源系統:vitess(YouTube的資料庫proxy系統)、nsq(bitly的一個即時資訊處理系統)、skynet(輕量級的分布式服務架構)、七牛公司全部用Go開發、360開發的類iMessage應用,支援上千萬使用者,同時單台伺服器長連80w,這些系統都是他們線上跑的,這給我更大的信心能夠用Go來開發高效能,高穩定的應用。
主要的缺點:
- 有些庫不成熟,例像處理。
- cgo在Window系統下面編譯很麻煩,就拿SQLite的資料庫驅動來說,在Window下面編譯就會遇到很大的麻煩。
- runtime還不夠成熟,GC還不是很好,不過聽說Go 1.1版本會有比較大的效能提升。
- Go的開源項目還不夠多。我覺得一個語言的發展不僅僅是語言本身出色,還要有大公司推動或者好的項目推動。
InfoQ:有人說Go是互連網時代的C語言。與之相比,Go語言有哪些優勢,又有哪些需要改進的地方呢?
謝孟軍:Go語言確實吸收了很多C語言的特性,Ken大叔畢竟是Unix的創始人,很多以前看C不習慣的地方,這一次Go裡面都改進了,例如{}的換行,()的去掉,強制格式化、去掉結尾分號等。而為什麼Go被稱為互連網時代的C呢?我認為是Go在語言層級上支援了並發,通過簡單的關鍵字go就可以充分利用多核,這對於硬體不斷髮展的時代,這麼簡單就可以充分利用硬體的多核,這是多麼重要的一個特性啊!但是相比C而言,Go還缺少一些高品質的第三方包,例如OpenGL等,所以Go內部也支援用cgo直接調用C語言編寫的代碼。
InfoQ:有人認為Go語言會在以後追趕上Java。與之相比,Go語言有哪些優勢,又有哪些需要改進的地方呢?
謝孟軍:我的感覺,Go要趕超Java還不知道要等到什麼年代。 首先,Java目前在公司專屬應用程式中非常穩定,而且基於Java的應用很多,庫也多,我想Java也會有很多基於JVM的類似語言出現,例如Scala,我想Go要超越Java可能性不大。但是Go相比Java來說優點也是很明顯的:簡單,足夠簡單。記得以前有一篇Go創作者Rob寫過一篇文章《大道至簡》,就是講為什麼建立Go語言的過程。我想這一批老程式員的經驗是值得我們學習的,就讓我們用Go語言把複雜的事情簡單化,簡單的事情簡單做,Go也許就是這樣一種語言。
InfoQ:您現在是否已經在項目中大量應用Go語言,主要在哪些方面呢?
謝孟軍:我現在開發的項目基本都是用Go開發的,但是頁面上我還是用JavaScript來渲染,我現在的開發模式是JavaScript渲染前端+RESTful API,中間用JSON資料進行互動。採用這種模式開發主要有幾點原因:
- 我認為JavaScript渲染頁面方面比Go的模板做的好很多,而且JavaScript現有的庫非常多,很容易做出很多效果,我的理念就是不管白貓黑貓,會抓老鼠就是好貓,合適的語言用在合適的地方。
- Go開發API相當地快速,而且效能很高,是PHP、Python之類的不能比擬的。
- 設計成RESTful API的話,系統就比較容易擴充,擴充性比較好。
目前內部的短網域名稱服務 (DNS)採用了Go+redis開發,ApsaraVideo for Live調度器全部採用了Go開發,內部的系統監控和自動化營運系統採用了JavaScript+RESTful API的形式開發,還有其他一些邊緣項目都是採用Go開發。
同時我還開發了兩個開源的項目:
- beego:一個模仿Python的tornado系統開發的Go開發架構,現在開發的幾個系統都是基於該架構開發。
- beedb: 一個Go語言的ORM庫,可以像操作struct一樣操作資料庫資料。目前我們內部的API介面我就是採用了這個ORM開發的。
InfoQ:您認為Go語言在Web編程方面,哪些特點會讓它更有優勢?
謝孟軍:前面也說了Go語言設計的時候是系統層級的語言,所以他本身就有效能上面的優勢。其次Go在Web開發中內建的net/http包對於開發Web非常方便,使用者可以很方便的就搭建一個Web應用。熟悉PHP的同學可能對於nginx+fastcgi配置都很熟悉,但是Go開發的應用就不需要nginx,因為它自己就可以監控網路,解析資料包,而不依賴任何東西,你編譯完之後扔到伺服器起來就好了,這省去了一些部署的部分。最後就是Go的並發支援,大家都聽說過摩爾定律,硬體只會越來越快,CPU的核心數也會越來越多,那麼Go的這個特性就讓我們這些程式員從以前的多執行緒中解放出來,讓Go語言的runtime來幫我們做這個事情,那用使用Go來編寫Web何樂而不為呢?
InfoQ:對於開始學習Go語言,並期待將其應用在項目中的讀者們,您有哪些建議呢?
謝孟軍:剛開始學習Go語言的朋友,我建議讀一下官方的一些文章,都非常有協助,如果你對英文敏感的話,那麼就看看我寫的那本書《Go Web編程》。
在你應用Go到你的項目之前,希望你能夠對於Go的特性有一定瞭解。目前Go語言的特性基本已經確定,接下來的版本都是基於效能的提升,新特性估計不大會有。然後,建議大家多讀讀Go內建的包原始碼,因為這些包都是Go語言開發的,對於我們編寫Go代碼又很大的協助,看看這些牛人們是怎麼編寫代碼的。有句話說得好:學習牛人,複製牛人,超越牛人,最後我們自己成為牛人。
最後還是希望國內的技術人都學習一下Go語言,不管它現在對你有沒有用,但是我可以肯定的說將來肯定有用,對於你開發項目時有擴充思路的作用,我現在也在學習Node.js、Erlang,我學習他們是為了更好的開發Go的項目,借鑒其他語言的一些特性。