本書(shū)基于Go語(yǔ)言源碼提煉出Go特性的實(shí)現(xiàn)原理,并配以大量圖表和實(shí)例以通俗易懂的語(yǔ)言描述出來(lái),包括常見(jiàn)數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)原理(包括chan、slice、map、struct等),常見(jiàn)控制結(jié)構(gòu)實(shí)現(xiàn)原理(包括defer、select、range、mutex等),Go協(xié)程、內(nèi)存管理、反射等機(jī)制,Go 工具鏈指導(dǎo)及原理(包括單元測(cè)試、性能測(cè)試、依賴管理等)。另外,本書(shū)還包括由實(shí)際項(xiàng)目Bug復(fù)盤(pán)而來(lái)的案例分享,包括定時(shí)器資源泄露、語(yǔ)法糖陷阱等。本書(shū)還包含大量練習(xí)題目,甚至可以作為面試題目來(lái)源。
Go語(yǔ)言是由Google公司開(kāi)源的一門(mén)編程語(yǔ)言,雖然正式歷史只有短短10年不到(2012年發(fā)布1.0版本),但在多個(gè)領(lǐng)域尤其是云計(jì)算領(lǐng)域得到了快速及廣泛的應(yīng)用。相對(duì)于C這種底層系統(tǒng)語(yǔ)言,Go語(yǔ)言增加了自動(dòng)垃圾回收、協(xié)程、接口等現(xiàn)代語(yǔ)言中常見(jiàn)的高級(jí)特性,而相對(duì)于Java、Python等應(yīng)用開(kāi)發(fā)語(yǔ)言,Go語(yǔ)言移除或弱化了泛型、類(lèi)、元編程、Lambda表達(dá)式等高級(jí)特性。Go語(yǔ)言因此兼?zhèn)淞讼到y(tǒng)級(jí)語(yǔ)言所需要的“輕快靈”,以及應(yīng)用級(jí)語(yǔ)言所需要的“低門(mén)檻、高生產(chǎn)力”。Go語(yǔ)言非常適合用于云服務(wù)開(kāi)發(fā)、應(yīng)用服務(wù)端開(kāi)發(fā),以及在通用Linux上的部分嵌入式系統(tǒng)開(kāi)發(fā)。
Go語(yǔ)言的快速發(fā)展也離不開(kāi)開(kāi)源社區(qū)的支持。Go語(yǔ)言自開(kāi)源起就引發(fā)了大量開(kāi)發(fā)者的關(guān)注,并且基于Go語(yǔ)言誕生了大批知名的開(kāi)源項(xiàng)目,其中□引人矚目的無(wú)疑是Kubernetes、Docker,以及托管在CNCF(云原生計(jì)算基金會(huì))旗下的大批云原生開(kāi)源項(xiàng)目。Go語(yǔ)言也因此被稱(chēng)為“云基礎(chǔ)設(shè)施語(yǔ)言”,Google公司的Go產(chǎn)品負(fù)責(zé)人更是稱(chēng)Go語(yǔ)言為“云的語(yǔ)言”。
在筆者所在的華為公司,Go語(yǔ)言被作為公司級(jí)的五種指定編程語(yǔ)言之一(其他四種為C、C++、Java、Python),并且在華為云云原生產(chǎn)品研發(fā)部門(mén)作為□□編程語(yǔ)言。華為云目前有多達(dá)30款以上的云服務(wù)產(chǎn)品以Go語(yǔ)言為主力編程語(yǔ)言,并且基于Go語(yǔ)言制定了公司級(jí)的編程規(guī)范,以及生產(chǎn)級(jí)高可靠、高安全、高性能的可信編程要求。本書(shū)內(nèi)容也源自筆者團(tuán)隊(duì)在Kubernetes、Docker等云原生開(kāi)源社區(qū),以及華為云多款云原生服務(wù)產(chǎn)品中的實(shí)際生產(chǎn)級(jí)經(jīng)驗(yàn)總結(jié)。
本書(shū)寫(xiě)作目的
本書(shū)作為華為云原生技術(shù)叢書(shū)的一員,面向Go語(yǔ)言程序員及感興趣的技術(shù)人員,普及與推廣Go語(yǔ)言。
很多公司推崇“一次性把事情做對(duì)”的文化,對(duì)于編程而言,一次性寫(xiě)出高質(zhì)量的代碼就是對(duì)該文化□好的詮釋。寫(xiě)出高質(zhì)量的代碼,對(duì)程序員有兩點(diǎn)基本要求:
◎ 精通編程語(yǔ)言的內(nèi)部實(shí)現(xiàn)機(jī)制;
◎ 豐富的實(shí)踐經(jīng)驗(yàn),不斷總結(jié)。
Go語(yǔ)言是一門(mén)非常容易上手的語(yǔ)言,即便是新手,通過(guò)官方文檔都可以很快地熟悉其語(yǔ)法并運(yùn)用到項(xiàng)目中。面對(duì)項(xiàng)目需求,我們不僅需要將其快速地實(shí)現(xiàn)出來(lái),而且還要保證它總是能按照我們的預(yù)期運(yùn)行,這就需要對(duì)編程語(yǔ)言有比較深入的認(rèn)識(shí)。考慮到寫(xiě)出沒(méi)有缺陷的程序是我們始終追求但永遠(yuǎn)無(wú)法實(shí)現(xiàn)的奢望,我們所能做的只是盡可能地減少缺陷及從缺陷中不斷學(xué)習(xí)。
本書(shū)希望把筆者對(duì)Go語(yǔ)言的理解,以及來(lái)自云原生開(kāi)源社區(qū)和公司內(nèi)部的經(jīng)驗(yàn)與廣大的Go語(yǔ)言從業(yè)者分享,希望能幫助讀者提升自身對(duì)Go語(yǔ)言的認(rèn)識(shí)、寫(xiě)出高質(zhì)量的代碼。
本書(shū)特點(diǎn)
這是一本定位于Go語(yǔ)言進(jìn)階的書(shū)籍,主要講解Go語(yǔ)言特性的實(shí)現(xiàn)機(jī)制,但為了照顧新手程序員,也為了循序漸進(jìn)、由淺入深地展開(kāi)介紹,在介紹特性前也會(huì)從基礎(chǔ)用法講起,所以不管是初級(jí)程序員,還是有一定編程經(jīng)驗(yàn)的程序員,都可以是本書(shū)的讀者。
了解Go語(yǔ)言特性□直接的做法是閱讀其實(shí)現(xiàn)源碼,但Go語(yǔ)言源碼晦澀難懂,容易讓人望而生畏。所以,如何從浩如煙海的源碼中提煉出實(shí)現(xiàn)原理并以讀者容易理解的方式描述出來(lái)就是本書(shū)的重點(diǎn)。
在講解Go語(yǔ)言實(shí)現(xiàn)原理時(shí),本書(shū)盡可能地使用源碼中的數(shù)據(jù)結(jié)構(gòu),并配以適量的圖文來(lái)幫助理解。除了對(duì)Go語(yǔ)言特性的介紹,本書(shū)還包括一些精心設(shè)計(jì)的測(cè)試題目,用于幫助讀者檢驗(yàn)自己的能力水平。此外,本書(shū)還收錄了一些發(fā)生在真實(shí)項(xiàng)目中的陷阱案例,這些案例大都源自商業(yè)項(xiàng)目或開(kāi)源項(xiàng)目,值得參考。
本書(shū)結(jié)構(gòu)
本書(shū)內(nèi)容涵蓋常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)、控制結(jié)構(gòu)、基礎(chǔ)概念、標(biāo)準(zhǔn)庫(kù)、工程工具及案例分享。
□□章和第2章主要介紹常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),如管道、切片、map等,以及常見(jiàn)的控制結(jié)構(gòu),如select和range。建議讀者在閱讀這兩章時(shí)先認(rèn)真做一做每個(gè)章節(jié)的“熱身題目”,以便于檢測(cè)自已對(duì)相關(guān)知識(shí)點(diǎn)的掌握程度。
第3章和第4章主要介紹Go語(yǔ)言關(guān)鍵的概念,即協(xié)程和垃圾回收。協(xié)程機(jī)制涉及操作系統(tǒng)的設(shè)計(jì),而垃圾回收涉及內(nèi)存管理,都是比較復(fù)雜的知識(shí),這兩章主要介紹一些基礎(chǔ)的概念,可作為讀者進(jìn)一步深入研究的引子。
第5章至□□0章主要介紹常用Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)原理,比如互斥鎖、讀寫(xiě)鎖、context、reflect、testing、timer等。這些章節(jié)沒(méi)有先后順序之分,讀者可以根據(jù)自身需求選擇閱讀。
□□1章和□□2章包含了Go語(yǔ)言工具鏈的內(nèi)容,包括如何管理多個(gè)Go版本及Go Module。Go Module是Go官方提供的依賴包管理工具,其他第三方依賴包管理工具逐漸被Go Module所替代,這部分內(nèi)容不僅包含如何使用Go Module,還對(duì)Go Module的實(shí)現(xiàn)機(jī)制做了探討。
□□3章記錄了來(lái)自開(kāi)源社區(qū)和實(shí)際生產(chǎn)級(jí)項(xiàng)目的部分“踩坑”案例,出于信息安全、方便敘述的考慮,筆者對(duì)這些案例做了一定程度的精簡(jiǎn),實(shí)際項(xiàng)目中這些問(wèn)題會(huì)非常隱蔽。雖然這些知識(shí)點(diǎn)在前面的章節(jié)中均有介紹,但本章還是值得閱讀,因?yàn)閷?xiě)出高質(zhì)量代碼不僅需要對(duì)語(yǔ)言本身有深刻的理解,也需要不斷吸取前人的經(jīng)驗(yàn)。
本書(shū)援引的Go語(yǔ)言源碼,如無(wú)特別注明,則主要源自Go 1.11,同時(shí)本書(shū)也覆蓋了Go 1.12至1.14版本新增的主要特性。
勘誤和支持
若您在閱讀本書(shū)的過(guò)程中有任何問(wèn)題或者建議,可以通過(guò)本書(shū)源碼倉(cāng)庫(kù)提交Issue或者PR,也可以關(guān)注容器魔方微信公眾號(hào)并加入微信群與作者交流。我們十分感謝并重視您的反饋,會(huì)對(duì)您提出的問(wèn)題、建議進(jìn)行梳理與反饋,并在本書(shū)后續(xù)版本中及時(shí)做出勘誤與更新。
致謝
在本書(shū)的寫(xiě)作及成書(shū)過(guò)程中,本書(shū)作者團(tuán)隊(duì)得到了公司內(nèi)外許多領(lǐng)導(dǎo)、同事、朋友及家人的鼓勵(lì)和幫助。
感謝華為云鄭葉來(lái)、張宇昕、高江海、李幫清、方璞等業(yè)務(wù)主管對(duì)華為云原生技術(shù)叢書(shū)及本書(shū)寫(xiě)作的大力支持。
感謝華為云可信軟件能力團(tuán)隊(duì)的李新峰、彭瑞林、黃凌云,以及華為云容器團(tuán)隊(duì)王澤鋒、毛杰、張琦、黃毽等對(duì)本書(shū)的審閱和建議。
感謝電子工業(yè)出版社博文視點(diǎn)陳曉猛編輯,陳編輯一絲不茍地制定出版計(jì)劃及組織工作,本書(shū)才得以順利出版。
感謝每一位Go語(yǔ)言布道者,他們的各種分享、博客文章及書(shū)籍都在積極推動(dòng)著Go語(yǔ)言的發(fā)展,也為本書(shū)編寫(xiě)提供了靈感和參考;
任洪彩
華為云原生開(kāi)源團(tuán)隊(duì)核心成員
劉赫偉 博士
華為云原生技術(shù)叢書(shū) 總編
華為云容器服務(wù)域 技術(shù)總監(jiān)
華為云原生團(tuán)隊(duì)核心成員,開(kāi)源愛(ài)好者,深度參與CNCF(云原生計(jì)算基金會(huì))旗下Kubernetes、Prometheus等項(xiàng)目貢獻(xiàn),Kubernetes資深成員,擔(dān)任Kubernetes SIG-Instrumentation Approver,敏捷軟件思想深度實(shí)踐者,在Nokia、華為等公司參與過(guò)多個(gè)大型項(xiàng)目的研發(fā)與重構(gòu),對(duì)Go、C/C++、Python、Swift等語(yǔ)言均有深入的研究與實(shí)踐。