- Go Web編程
- 謝孟軍
- 3436字
- 2018-12-27 18:47:49
推薦序一
很高興聽到謝孟軍的《Go Web編程》要出版。當(dāng)謝孟軍找我寫推薦序時,盡管工作非常繁忙,我還是一口應(yīng)承下來了。原因很簡單,作為國內(nèi)首家完全采用Go語言開發(fā)的公司,七牛非常樂意見到Go語言社區(qū)的繁榮。去年在Google Trends上Golang關(guān)鍵字的搜索指數(shù),中國排在全球首位(比美國多3倍),這是整個中國Go語言社區(qū)共同努力的結(jié)果。
遠(yuǎn)在2007年第2屆ECUG大會,我講了《我為什么選擇了Erlang》的議題。其中提到了我對未來軟件產(chǎn)業(yè)趨勢的判斷:
● 存儲與計算向服務(wù)端轉(zhuǎn)移
● 從“PC單機(jī)”到“強(qiáng)悍的服務(wù)器+多元化的終端”(手機(jī)、PC、PDA、電視機(jī)頂盒、車載終端)
這個趨勢判斷對我職業(yè)生涯的影響非常重大。它促使我放棄了近 10 年的桌面開發(fā)經(jīng)驗(包括大學(xué)時期),轉(zhuǎn)向服務(wù)端開發(fā)。正如我在《我為什么選擇了Erlang》中建議的那樣:
● 要么就不寫程序,要么就寫服務(wù)器端的程序
● 當(dāng)然,你也可以去撰寫移動終端設(shè)備上的代碼,在PC平臺上做開發(fā)的空間很小
于是,我開始了長達(dá)四、五年之久的服務(wù)端開發(fā)最佳實踐的探索。直到有一天,我遇到了Go語言。
我從來不認(rèn)為自己是一個預(yù)言師,但關(guān)注過我的人可能都知道,我在新浪微博、《Go語言編程》一書中都非常高調(diào)地下了一個論斷:Go 語言將超過 C 語言、Java,成為未來十年最流行的語言。
為什么我可以如此堅定地相信,選擇Go語言不會有錯,并且相信Go語言會成為未來十年最流行的語言?除了Go語言的并發(fā)編程模型深得我心外,Go語言的各種語法特性顯得那么深思熟慮、卓絕不凡,其對軟件系統(tǒng)架構(gòu)的領(lǐng)悟,讓我深覺無法望其項背,處處帶給我驚喜。
Go語言給我的第一個驚喜,是大道至簡的設(shè)計哲學(xué)。
Go語言是非常簡約的語言。簡約的意思是少而精,少就是指數(shù)級的多。Go語言極力追求語言特性的最小化,如果某個語法特性只是少寫幾行代碼,但對解決實際問題的難度不會產(chǎn)生本質(zhì)的影響,那么這樣的語法特性就不會被加入。Go 語言更關(guān)心的是如何解決程序員開發(fā)上的心智負(fù)擔(dān)。如何減少代碼出錯的機(jī)會,如何更容易寫出高品質(zhì)的代碼,是Go語言設(shè)計時極度關(guān)心的問題。
Go 語言追求顯式表達(dá)。任何封裝都是有漏洞的,最佳的表達(dá)方式就是用最直白的表達(dá)方式。所以也有人稱Go語言為“所寫即所得”的語言。
Go 語言也是非常追求自然(nature)的語言。Go 不只是提供極少的語言特性,并極力追求語言特性最自然的表達(dá),也就是這些語法特性被設(shè)計成恰如多少人期望的那樣,盡量避免爭議。事實上Go語言的語法特性上的爭議非常少,這些也讓Go語言的入門門檻變得非常低。
Go語言給我的第二個驚喜,是最對胃口的并行支持。
我對服務(wù)端開發(fā)的探索,始于 Erlang 語言,并且認(rèn)為 Erlang 風(fēng)格并發(fā)模型的精髓是輕量級進(jìn)程模型。然而Erlang除了語言本身不容易被程序員接受外,其基于進(jìn)程郵箱做消息傳遞的并發(fā)編程模型也小有瑕疵。我曾經(jīng)在C++中實現(xiàn)了一個名為CERL的網(wǎng)絡(luò)庫,剛開始在C++中完全模仿Erlang風(fēng)格的并發(fā)編程手法,然而在我拿CERL庫做云存儲服務(wù)的實踐中,發(fā)現(xiàn)了該編程模型的問題所在并做了相應(yīng)的調(diào)整,這就是后來的CERL 2.0版本。有意思的是,CERL 2.0與Go語言的并行編程思路不謀而合。某種程度上來說,這種默契也是我創(chuàng)辦七牛時,Go 語言語法特性甚至都還沒有完全穩(wěn)定,我們技術(shù)選型就堅決地采納了Go語言的重要原因。
Go語言給我的第三個驚喜,是interface。
Go語言的interface,并非是你在Java和C#中看到的interface,盡管看起來有點像。Go 語言的 interface 是非侵入式的接口,具體表現(xiàn)在實現(xiàn)一個接口不需要顯式地進(jìn)行聲明。不過,讓我意外的不是Go語言的非侵入式接口,非侵入式接口只是我接受Go語言的基礎(chǔ)。在接口(或契約)的表達(dá)上,我一直認(rèn)為Java和C#這些主流的靜態(tài)類型語言都走錯了方向。C++的模板盡管機(jī)制復(fù)雜,但是走在了正確的方向上。C++0x(后來的C++11)呼聲很高的concept提案被否,著實讓不少人傷了心。但Go語言的interface遠(yuǎn)不是非侵入式接口那么簡單,它是Go語言類型系統(tǒng)的綱,這表現(xiàn)在:
1.只要某個類型實現(xiàn)了接口要的方法,那么我們說該類型實現(xiàn)了此接口。該類型的對象可賦值給該接口。
2.作為1的推論,任何Go語言的內(nèi)置對象都可以賦值給空接口interface{}。
3.支持接口查詢。如果你曾經(jīng)是Windows程序員,你會發(fā)現(xiàn)COM思想在Go語言中通過interface優(yōu)雅呈現(xiàn)。并且Go語言吸收了其中最精華部分,而COM中對象生命周期管理的負(fù)擔(dān),卻因為 Go 語言基于 GC(垃圾回收機(jī)制)方式的內(nèi)存管理而不復(fù)存在。
Go語言給我的第四個驚喜,是極度簡化但完備的“面向?qū)ο缶幊蹋∣OP)”方法。
Go語言廢棄大量的OOP特性,如繼承、構(gòu)造/析構(gòu)函數(shù)、虛函數(shù)、函數(shù)重載、默認(rèn)參數(shù)等,簡化的符號訪問權(quán)限控制、將隱藏的this指針改為顯式定義的receiver對象。Go語言讓我看到了OOP編程核心價值原來如此簡單——只是多數(shù)人都無法看透。
Go語言帶給我的第五個驚喜,是它的錯誤處理規(guī)范。
Go語言引入了內(nèi)置的error類型及defer關(guān)鍵字來編寫異常安全代碼,讓人拍案叫絕。下面這個例子,我在多個場合都提過。
f, err := os.Open(file) if err != nil { ... // error processing return } deferf.Close() ... // process file data
Go語言帶給我的第六個驚喜,是它功能的內(nèi)聚。
一個最典型的案例是Go語言的組合功能。對于多數(shù)語言來說,組合只是形成復(fù)合類型的基本手段,這一點只要想想C語言的struct就清楚了。但Go語言引入了匿名組合的概念,它讓其他語言原本需要引入繼承這一新概念來完成事情,統(tǒng)一又到了組合這樣的一個基礎(chǔ)上。
在C++中,你需要這樣定義一個派生類。
class Foo : public Base { ... };
在Go語言中你只要
type Foo struct { Base ... }
更有甚者,Go語言的匿名組合允許組合一個指針。
type Foo struct { *Base ... }
這個功能可以實現(xiàn)C++中一個無比晦澀難懂的特性,叫“虛擬繼承”。但同樣的問題,換從組合角度來表達(dá),直達(dá)問題的本質(zhì),清晰易懂。
Go語言帶給我的第七個驚喜,是消除了堆與棧的邊界。
在Go語言之前,程序員是清楚地知道哪些變量在棧上,哪些變量在堆上。堆與棧是基于現(xiàn)代計算機(jī)系統(tǒng)的基礎(chǔ)工作模型上形成的概念,Go 語言屏蔽了變量定義在堆還是棧上這樣的物理結(jié)構(gòu),相當(dāng)于封裝了一個新的計算機(jī)工作模型。這一點看似與Go語言顯式表達(dá)的設(shè)計哲學(xué)不太一致,但我個人認(rèn)為這是一項了不起的工作,而且與Go語言的顯式表達(dá)并不矛盾。Go 語言強(qiáng)調(diào)的是對開發(fā)者的程序邏輯(語義)的顯式表達(dá),而非對計算機(jī)硬件結(jié)構(gòu)的顯示表達(dá)。對計算機(jī)硬件結(jié)構(gòu)的高度抽象,將更有助于Go語言適應(yīng)未來計算機(jī)硬件發(fā)展的變化。
Go語言帶給我的第八個驚喜,是Go語言對C語言的支持。
可以這么說,Go語言是除了Objective-C、C++這兩門以兼容C為基礎(chǔ)目標(biāo)的語言之外的所有語言中,對 C 語言支持最友善的一個。什么語言可以直接嵌入 C 代碼?沒有,除了Go語言。什么語言可以無縫調(diào)用C函數(shù)?沒有,除了Go語言。對C語言的完美支持,是Go語言快速崛起的關(guān)鍵支撐。還有比C語言更讓人覬覦的社區(qū)財富么?那是一個取之不盡的金礦。
總而言之,Go語言是一門非常具變革性的語言。盡管這四十多年來(從20世紀(jì)七十年代C語言誕生開始算起)出現(xiàn)的語言非常多,各有各的特色,讓人眼花繚亂。但是我個人固執(zhí)地認(rèn)為,談得上突破了C語言思想,將編程理念提高到一個新高度的,僅有Go語言而已。
Go語言很簡單,但是具備極強(qiáng)的表現(xiàn)力。從目前的狀態(tài)來說,Go語言主要關(guān)注服務(wù)器領(lǐng)域的開發(fā),但這不會是Go語言的完整使命。
我們說Go語言適合服務(wù)端開發(fā),僅僅是因為它的標(biāo)準(zhǔn)庫支持方面,目前是向服務(wù)端開發(fā)傾斜:
● 網(wǎng)絡(luò)庫(包括socket、http、rpc等)
● 編碼庫(包括json、xml、gob等)
● 加密庫(各種加密算法、摘要算法,極其全面)
● Web(包括template、html支持)
而作為桌面開發(fā)的常規(guī)組件:GDI和UI系統(tǒng)與事件處理,基本沒有涉及。
盡管Go還很年輕,Go語言1.0版本在2012年3月底發(fā)布,到現(xiàn)在才1年多,然而Go語言已經(jīng)得到了非常普遍的認(rèn)同。在國外,有人甚至提出“Go語言將制霸云計算領(lǐng)域”。在國內(nèi),幾乎所有你聽到過名字的大公司(騰訊、阿里巴巴、京東、360、網(wǎng)易、新浪、金山、豆瓣等等),都有團(tuán)隊對Go做服務(wù)端開發(fā)進(jìn)行了小范圍的實踐。這是不能不說是一個奇跡。
與之相反的是,因為年輕,Go 語言的資料,尤其是中文資料極度匱乏。在這樣的背景下,《Go Web編程》這樣一本有非常強(qiáng)的實踐背景的圖書出版了,這絕對是雪中送炭。
《Go Web編程》圍繞做一個Web服務(wù)相關(guān)的一個個問題域展開:表單處理、數(shù)據(jù)庫、會話(Session)、安全、國際化和本地化、日志、部署與維護(hù)。最后,結(jié)合作者的實踐,本書給出了一個參考的Web編程框架,以簡化Web編程,提升開發(fā)效率。
無論是對那些只是聽過 Go 語言而打算開始了解的朋友,還是對那些已經(jīng)進(jìn)行 Go語言開發(fā)的朋友,本書都極具參考價值。
另外值得一提的是,除了《Go Web編程》一書外,謝孟軍也發(fā)起了Go語言標(biāo)準(zhǔn)庫文檔的翻譯工作,這是一項艱苦的工作,但可以預(yù)期將對Go語言的發(fā)展起到重要作用,讀者如果有意為開源貢獻(xiàn)自己的一份力量,歡迎你能夠積極參與其中。
七牛云存儲CEO 許式偉
2013年4月
- 新一代通用視頻編碼H.266/VVC:原理、標(biāo)準(zhǔn)與實現(xiàn)
- Mastering Python Scripting for System Administrators
- Magento 2 Development Cookbook
- 64位匯編語言的編程藝術(shù)
- 面向?qū)ο蟪绦蛟O(shè)計(Java版)
- JavaScript動態(tài)網(wǎng)頁開發(fā)詳解
- 軟件項目管理實用教程
- 重學(xué)Java設(shè)計模式
- 高級語言程序設(shè)計(C語言版):基于計算思維能力培養(yǎng)
- MATLAB 2020從入門到精通
- Getting Started with Laravel 4
- 運(yùn)用后端技術(shù)處理業(yè)務(wù)邏輯(藍(lán)橋杯軟件大賽培訓(xùn)教材-Java方向)
- SignalR:Real-time Application Development(Second Edition)
- Building Business Websites with Squarespace 7(Second Edition)
- 從零開始構(gòu)建深度前饋神經(jīng)網(wǎng)絡(luò):Python+TensorFlow 2.x