Andes Home 千年的塔 -十年技術,風雨兼程
書籍概況
Go語言的核心語言特性包括:型別系統、介面、併發。這三部分是Go語言精華、優美、也是重要的特徵,本書緊密圍繞這三個主題展開。以“型別系統”為例,Go語言中的型別有:簡單型別、複合型別、命名型別、未命名型別、靜態型別、動態型別、底層型別、介面型別、具體型別以及型別字面量等諸多概念,這些概念在其他Go類圖書裡面鮮有介紹,本書試圖幫助讀者梳理清楚這些型別的含義,建立概念,認清型別本質並學會正確使用;在介面章節,不單介紹了介面概念和用法,還深入分析了介面的機制,使讀者對Go語言非侵入式的介面有更深入的理解;在併發程式設計章節,書中給出了5個併發程式設計正規化,並用圖描述併發程式的模型,通俗易懂,這也是本書讀特點。此外本書還拿出一整章內容介紹Go語言程式設計過程中可能遇到的陷阱,不僅告訴讀者陷阱是什麼,正確使用方式是什麼,同時也給出出現這種問題的根本原因,使讀者後續能夠避免犯同樣的錯誤。本書最後從哲學角度論述下Go語言的程式設計思想,相信Go語言愛好者一定可以從書中找到自己感興趣內容。 感興趣的點選圖片連結書籍的詳情。
這本書特點
- 不是前篇一律的堆積羅列語法。
本書精煉的使用一個章節介紹了Go語言的基礎支援:包括關鍵字、資料型別和控制結構。不是一個個語法點的堆砌,而是將源程式看成一個整體,從原始碼的整體構造上講解語法,事半功倍。 - 既講到怎麼使用,也講到內部原理。
Go有一些明顯區別其他語言的地方,比如函式的多值返回、併發等,在介紹這些專題的章節最後都會有一個深入分析原理的章節。介紹下Go語言的內部實現機制和原理。 - 程式設計哲學方面的思考。
最後在本章的最後分析下為什麼Go語言更適合程式設計,更適合建模解決現實問題,基於幾個哲學方面的思考,讓讀者更深層次上理解Go的設計思想。
圖書連線
寫作背景
2007 年,Go 語言誕生於谷歌公司,2009 年開源,2012 年推出1.0 版本,曾兩次獲得TIOBE年度語言(2009 年和2016 年)。2012 年起,全球大量的開源專案開始使用Go 語言進行開發,目前Go 語言已經成為雲端計算領域事實上的標準語言,特別是在容器領域,誕生了一大批優秀的開源軟體,如Docker、Kubernetes 等。2017 年區塊鏈技術在國內大熱,區塊鏈兩個大的技術平臺以太坊(Ethereum)和超級賬本(Hyperledger)子專案Fabric 都是基於Go 語言構建的。Go 語言的應用領域逐步擴大,目前在區塊鏈、雲端計算、中介軟體和伺服器程式設計領域顯現出明顯的優勢。Go 語言最先在雲端計算公司盛行,隨後大量的網際網路初創企業將Go 語言作為後臺主要開發語言。目前,無論網際網路公司裡的獨角獸,還是BAT(百度、阿里巴巴、騰訊),都已將Go語言作為其技術棧的重要組成部分。市場對於Go 語言程式設計人才的需求量也在持續上升。
目前,Go 語言程式設計類圖書有如下幾個類別。
基礎全面型
七牛團隊寫作和翻譯的幾本書(《Go 語言程式設計》《Go 程式設計語言》等),系統地介紹了Go 開發的基礎知識,為Go 語言在國內的推廣做出了很大的貢獻。
原始碼深入型
雨痕的《Go 語言學習筆記》,上半部分是對 Go 語言基礎知識的總結,下半部分對原始碼進行了分析,是學習Go 語言內部原理非常好的參考書。
專業領域型
專注於介紹某個應用領域,比如謝孟軍的《Go Web 程式設計》,這類圖書主要是介紹使用Go
語言在某個領域進行開發的相關知識。
市面上Go 語言的圖書這麼多了,為什麼又要寫一本,本書和市面上的圖書有什麼區別呢?這也是我寫這本書之前就認真思考過的問題。我發現市面上缺少介紹Go 語言核心特性和使用陷阱的書。Go 語言核心特性包括型別系統、介面、併發,這三部分是Go 語言最精華、最優美、最重要的語言特性。於是我就圍繞這三個主題寫了本書,書名就叫《Go 語言核心程式設計》。以型別系統為例,Go 語言中的型別涉及簡單型別、複合型別、命名型別、未命名型別、靜態型別、動態型別、底層型別、介面型別、具體型別及型別字面量等諸多概念,這些在先前的書籍裡沒有系統地介紹過,本書試圖幫助讀者梳理清楚這些型別的含義,建立概念,認清型別本質並學會使用;在併發程式設計中給出了5 個併發程式設計正規化並系統地介紹了context 標準庫,這也是本書特有的。
內容簡介
本書共9 章,圍繞如下主題展開:基礎知識(第1 章)、語言核心(第2 章~第7 章)、工程管理(第8 章)和程式設計哲學(第9 章)。
基礎知識
第1 章介紹Go 語言程式設計的基礎知識。基礎知識部分力求從系統性的角度講述Go 語言簡潔的語法知識,試圖幫助讀者瞭解Go 語言源程式基本結構,這是本書不同於其他書籍的地方。本章先對Go 的源程式進行整體介紹,然後從詞法分析的角度介紹Go 語言的各個token,接著介紹Go 語言的基礎語法:變數和常量、資料型別及控制結構,讓讀者學習Go 語言的語法知識時可以“既見樹木,又見森林”。
語言核心
本書的第2~7 章講解Go 語言核心知識,這部分是本書最核心、最重要的部分,主要圍繞如下4 個主題展開。
1.型別系統
本書用3 章的篇幅來講解Go 語言的型別系統,分別是第2 章函式、第3 章型別系統和第4章介面。型別系統是Go 語言的靈魂,Go 語言小而美的型別系統是其區別於其他語言的顯著特徵。函式在Go 語言中是“一等公民”,非侵入式的介面設計也很有特點。型別系統是本書的一條主要線索,幾乎貫穿本書的所有章節,在反射章節裡會對Go 的型別系統做一個總結。掌握型別系統是寫好Go 程式的關鍵。
2.併發程式設計
第5 章介紹Go 併發程式設計,併發程式設計的原生支援是Go 語言顯著的語言特徵。“不要通過共享記憶體來通訊,而是通過通訊來共享記憶體”,本章首先講解語言層面對併發的支援,接著講解context 標準庫的知識,最後講解常用的併發正規化和Go 併發模型。
3.反射
第6 章介紹Go 語言反射的相關知識。反射是Go 語言的高階特性,反射是把“雙刃劍”,用好了會有強大的威力,但由於其複雜性且易產生執行時panic,因此反射又表現出脆弱性。Go 語言沒有提供泛型支援,所以在開發框架和大型系統中反射是必須面對的一個技術點,市面上的圖書對這部分的介紹不多,本書分類總結了Go 的反射API,儘可能梳理出條理清晰的API結構;同時以型別系統和介面底層實現為基礎來介紹反射;最後介紹著名的Web 框架martini中使用的依賴注入庫inject。
4.陷阱和習慣用法
第7 章介紹Go 語言陷阱和一些習慣用法,包括Go 語言使用過程中容易出錯和初學者容易困惑的知識點。Go 語言雖然設計簡潔,但在某些方面還是有瑕疵的,比如 defer 陷阱、短變數的宣告range 臨時變數共享等。同時Go 又有其鮮明的書寫格式和習慣用法,本章的最後會介紹這些內容。
工程管理
Go 語言是一門面向工程的語言,而不是學術界的產物,第8 章介紹Go 語言工程管理方面的知識,主要介紹Go 的程式設計環境、名稱空間和包管理的相關內容。
程式設計哲學
第9 章討論程式設計哲學,這部分內容不是介紹程式設計細節知識,讀者可以把它當作散文來讀。先對Go 語言程式設計哲學做一個總結:少即是多,世界是並行的,組合優於繼承,面向介面程式設計,等等,試圖從哲學的角度來闡述這些設計思想的先進性。最後介紹Go 語言的里程碑事件及未來的發展方向。
相關約定
本書使用Go 代表Go 語言的簡寫,使用go 表示Go 語言的併發關鍵字,使用goroutine 代表Go 語言中的併發執行體。通道和chan 都代表Go 語言的通訊管道。切片和slice 都表示Go語言內建的可變陣列。本書使用例項或者型別例項表示具體型別的變數,而沒有使用傳統語言物件的概念。標準庫和標準包會混用,都是指Go 語言自帶的標準庫。複製和拷貝具有相同的語義,都表示將資料複製一份並拷貝到另一處記憶體空間。本書是基於Go 1.10.2 寫作的,新版本的變動請讀者以官方文件為準。截至本書出版時,Go 1.11 釋出,官方推出了新的包管理工具go mod,go mode 相容dep,dep 仍可放心使用,go mod 是新增的功能需要一段時間成熟。
總結
本書絕大大部分內容是筆者六年來學習和實踐Go語言過程中的總結和感悟,成書過程中也參閱了部分網上和官方資料,由於能力有限,錯誤或者疏忽之處難免發生,歡迎讀者指正,以便我們及時修訂,我的郵箱是[email protected]。