書評 《Go語言程式設計》

2021-09-17 04:42:29 字數 2866 閱讀 5806

由alan a. a. donovan與brian w. kernighan共同編著的新書《go程式語言》(go programming language)對go這門語言進行了一次精彩的介紹。本書涵蓋了包括go語言於2023年8月所發布的最新穩定版本1.5中的內容。讀者應當具備類c或python風格語言的程式設計經驗,但並不限定於具體某種語言。由於go是一種編譯型的型別化語言,因此,具有這方面程式設計經驗的開發者與偏重於指令碼語言或非型別語言的開發者相比,這門語言的學習曲線將顯得不那麼陡峭。\

本書的前半部分涵蓋了go程式語言的基礎,包括原始檔的格式與unicode編碼、變數、值型別,以及結構體、map、陣列以及slice等等。前半部分的結尾描述了go語言的異常處理機制panic與recover。\

本書的下半部分專注於在go語言中獨樹一職的一些特性:不用繼承而實現物件導向程式設計、隱式介面實現,當然還有通過協程(goroutine)實現併發程式設計。本書的結尾部分講述了一些實用的打包技巧、如何使用標準的go工具進行測試,以及關於反射及非安全**的參考。\

$ export gopath=$home/gobook            # choose workspace directory\$ go get gopl.io/ch1/helloworld         # fetch, build, install\$ $gopath/bin/helloworld                # run\
\

對於在其他型別的系統中使用go的讀者來說,他們必須對示例**進行一些調整。比方說要將gopath的設定方式變為set gopath=「%homepath%\\gobook」,並通過呼叫%gopath%\\bin\\helloworld的方式執行。\

第一章本身的內容進展很快,從如何通過類似於uniq這樣的unix工具的實現執行經典的「hello world」示例開始,一直講到如何生成活動的lissajous圖形、並通過乙個http服務返回該圖形。由於go是由google推出的語言,因此在網路應用示例部分還介紹了並髮式web爬蟲的概念。\

雖然第一章名為「指南」,但讀者可能會發現略過lissajous圖形示例(與網路應用示例)或許是種更好的做法,尤其是對於那些沒有數學背景的讀者來說。好在這些示例僅僅是本書之後將涵蓋的內容的一部分樣本,等讀者閱讀到後面這部分時,應該能夠更輕鬆地理解它。當讀者對於這門語言有更多的理解之後,這篇指南章節的後半部分應當顯得較容易理解。\

除了在本書的文字之間提供了大量的示例之外,每一小節通常還為讀者提供了大量的練習交由讀者完成,因為通過動手實踐進行學習的方式比起僅僅通過閱讀進行學習更有效得多。在練習之後還提供了大量的挑戰內容,要求讀者逐步完成更複雜的任務,以加深對這門語言的理解。\

本書第二章的開頭部分介紹了go語言的命名規範,不過對於公共可見的識別符號(以大寫字母開頭)與私有可見的識別符號(以小寫字母開頭)之間的區別沒有進行清晰地說明。有經驗的go語言使用者自然了解這一標準,但習慣快速翻閱的讀者卻很可能會忽略這一細節,而兩者所產生的效果的差別直到下一章關於包的部分才會真正講到。\

雖然有些瑕疵,但本書也為讀者提供了許多良好的建議,包括如何處理錯誤(在檢測到錯誤時選擇速錯,以避免錯誤的積累),以及如何使用defer註冊用於清理功能的處理函式,這在釋放互斥體鎖時尤其實用。本書不僅僅只觸及了go語言的基礎內容,整本書到處可見作者的真知灼見。特別值得一提的是如何在go的for迴圈中處理捕獲變數(captured variable),由於變數的作用域所限,必須在內部重新定義乙個變數,使它具有乙個不同的作用域:

for _, dir := range tempdirs() \
\

本書對於型別、結構體以及函式(function)和方法(method)進行了著重描述,因為這些元素的建立與用法與其他語言有所不同。 本書提到在建立方法時可以指定receiver型別,可選擇值型別或是引用型別,並能夠在其中使用除this/self之外的自定義名稱。在使用介面的時候,型別或結構體可以隱式地滿足某個介面的定義,對於空的介面型別來說,任何值都可以滿足該介面。本書在介紹介面的部分特意涵蓋了關於錯誤的更多細節,因為在go語言中的錯誤都是以介面的形式表現的。\

本書著重強調了使用互斥體(mutex)進行資料保護的重要性,它不僅能夠避免資料競態條件問題,同時也強調了在某些平台中,硬體本身需要在程式中加入一道強閘,以避免出現由於**順序被更改或者快取行的共享造成程式產生不一致結果的問題。本書描述了多種不同的鎖機制(例如簡單的互斥體或讀寫鎖),並且給出了每種不同實現方式的效能資料對比。\

本書所介紹的幾個協程為讀者展現了如何進行某些場景下的http處理,包括來自於多個客戶端的網路連線,以及執行多執行緒的web連線的抓取。在這幾個章節的結尾部分,作者介紹了乙個基於客戶端/伺服器結構的聊天網路的示例,聊天訊息可以在多個客戶端之間進行路由,並且能夠將資源的消耗降至最低。\

本書還為讀者介紹了如何使用go get工具實現包的獲取,以及go test這個測試工具的使用,此外還介紹了cpu、記憶體或互斥體的效能診斷工具。最後,本書對於非安全**以及反射包進行了簡單的介紹,並對於這些特性的應用提出了適當的警告:如無必要,請不要使用他們。\

在《go程式語言》一書的出版商addison wesley的**上可以購買本書的電子版,也可以在分銷商那裡購買實體書籍。\

\alan donovan是就職於google基礎設施部門的一位主管工程師,專攻軟體開發工具。從2023年之後,他開始加入go團隊,負責靜態分析庫與工具的設計。他同時也是oracle、godoc-analysis、eg以及gorename等工具的作者。\

brian kernighan在2023年之前就職於貝爾實驗室的電腦科學研究中心,當時他負責為unix開發語言與工具。他目前在普林斯頓大學的電腦科學系擔任教授一職。他同時也是多本技術書籍的合著者之一,包括《c程式語言》以及《程式設計實踐》。\

檢視英文原文:book review: the go programming language

書評 《Go語言程式設計》

由alan a.a.donovan與brian w.kernighan共同編著的新書 go程式語言 go programming language 對go這門語言進行了一次精彩的介紹。本書涵蓋了包括go語言於2015年8月所發布的最新穩定版本1.5中的內容。讀者應當具備類c或python風格語言的程...

書評 《Go語言程式設計》

由alan a.a.donovan與brian w.kernighan共同編著的新書 go程式語言 go programming language 對go這門語言進行了一次精彩的介紹。本書涵蓋了包括go語言於2015年8月所發布的最新穩定版本1.5中的內容。讀者應當具備類c或python風格語言的程...

書評 《Go語言程式設計》

由alan a.a.donovan與brian w.kernighan共同編著的新書 go程式語言 go programming language 對go這門語言進行了一次精彩的介紹。本書涵蓋了包括go語言於2015年8月所發布的最新穩定版本1.5中的內容。讀者應當具備類c或python風格語言的程...