足球资料库数据/孙祥/nba五佳球/足球直播哪个平台好 - cctv5今日现场直播

首頁 > 知識庫 > 正文

書評 —— 《Go語言編程》
2016-04-20 16:05:11   來源:Alex Blewitt ,譯者 邵思華   評論:0 點擊:

由Donovan與Kernighan共同編著的新書《Go編程語言》是一本易于理解的書籍,它展現了Go語言中的要點,并提供了諸多實用的提示與技巧。本書首先對于Go語言的語法進行了快速的講解,并逐漸深入,乃至利用互斥體與協程進行并發編程的知識。本書將帶領讀者進入Go語言基礎的奇妙旅程。歡迎閱讀InfoQ對于本書的書評。

由Alan A. A. Donovan與Brian W. Kernighan共同編著的新書《Go編程語言》(Go Programming Language)對Go這門語言進行了一次精彩的介紹。本書涵蓋了包括Go語言于2015年8月所發布的最新穩定版本1.5中的內容。讀者應當具備類C或Python風格語言的編程經驗,但并不限定于具體某種語言。由于Go是一種編譯型的類型化語言,因此,具有這方面編程經驗的開發者與偏重于腳本語言或非類型語言的開發者相比,這門語言的學習曲線將顯得不那么陡峭。

本書的前半部分涵蓋了Go編程語言的基礎,包括源文件的格式與Unicode編碼、變量、值類型,以及結構體、Map、數組以及Slice等等。前半部分的結尾描述了Go語言的異常處理機制Panic與Recover。

本書的下半部分專注于在Go語言中獨樹一職的一些特性:不用繼承而實現面向對象編程、隱式接口實現,當然還有通過協程(goroutine)實現并發編程。本書的結尾部分講述了一些實用的打包技巧、如何使用標準的Go工具進行測試,以及關于反射及非安全代碼的參考。

整本書中所介紹的示例都提供了相應的代碼(可在本書的官網上下載),也就是說可以通過以下命令(在Linux系統上)運行示例代碼:

$ 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%binhelloworld的方式運行。

本書的第一章(可在本書的官網上免費下載)就表現出了本書的風格,并且在本書的文字之間提供了豐富的示例,這樣的風格一直延續到了本書的結尾。

第一章本身的內容進展很快,從如何通過類似于uniq這樣的Unix工具的實現運行經典的“hello world”示例開始,一直講到如何生成活動的Lissajous圖形、并通過一個HTTP服務返回該圖形。由于Go是由Google推出的語言,因此在網絡應用示例部分還介紹了并發式web爬蟲的概念。

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

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

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

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

for _, dir := range tempDirs() {  dir := dir // NOTE: necessary!  // …}

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

如果對于這本《Go編程語言》的評論缺少了Go語言中獨一無二的特性:協程與管道(channel),它就不能算是一篇完整的書評。本書用了65頁、即相當于本書20%左右的篇幅描述了如何使用協程(異步調用函數)、以及如何通過固定大?。ň彌_)的管道或通過異步方式(無緩沖)實現協程之間的相互通信。在介紹如何使用管道發送簡單的信號時,本書為讀者展示了兩種選擇,一是將管道的閉包作為一種觸發器以執行某些行為,二是通過發送標記符號數據(通常會包括一個布爾值、一個整數值、或僅僅是一個空結構而已)以實現相同的效果。除此之外,本書也展示了如何通過使用多路復用選擇器,在多個管道間進行信號的獲取或發送。

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

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

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

在《Go編程語言》一書的出版商Addison Wesley的網站上可以購買本書的電子版,也可以在分銷商那里購買實體書籍。

關于本書作者

Alan Donovan是就職于Google基礎設施部門的一位主管工程師,專攻軟件開發工具。從2012年之后,他開始加入Go團隊,負責靜態分析庫與工具的設計。他同時也是oraclegodoc-analysis、eg以及gorename等工具的作者。

Brian Kernighan在2000年之前就職于貝爾實驗室的計算機科學研究中心,當時他負責為Unix開發語言與工具。他目前在普林斯頓大學的計算機科學系擔任教授一職。他同時也是多本技術書籍的合著者之一,包括《C程序設計語言》以及《程序設計實踐》

查看英文原文:Book Review: The Go Programming Language

相關熱詞搜索:the go programming language book review 語言 & 開發 Book Review InfoQ

上一篇:NGINX應用性能優化指南(第四部分):負載均衡
下一篇:VR熱播聯合創始人魏明:VR行業的使命是吸引大眾的關注和體驗

分享到: 收藏