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