This commit is contained in:
chai2010 2016-01-07 12:59:49 +08:00
parent 7f8669b33b
commit 148b541f1e
9 changed files with 17 additions and 14 deletions

View File

@ -1,6 +1,6 @@
## 致謝 ## 致謝
[Rob Pike](http://genius.cat-v.org/rob-pike/)和[Russ Cox](http://research.swtch.com/)以及很多其他Go糰隊的心成員多次仔細閲讀了本書的手稿他們對本書的組織結構和表述用詞等給出了很多寶貴的建議。在準備日文版翻譯的時候Yoshiki Shibata更是仔細地審閲了本書的每個部分及時發現了諸多英文和代碼的錯誤。我們非常感謝本書的每一位審閲者併感謝對本書給出了重要的建議的Brian Goetz、Corey Kosak、Arnold Robbins、Josh Bleecher Snyder和Peter Weinberger等人。 [Rob Pike](http://genius.cat-v.org/rob-pike/)和[Russ Cox](http://research.swtch.com/)以及很多其他Go糰隊的心成員多次仔細閲讀了本書的手稿他們對本書的組織結構和表述用詞等給出了很多寶貴的建議。在準備日文版翻譯的時候Yoshiki Shibata更是仔細地審閲了本書的每個部分及時發現了諸多英文和代碼的錯誤。我們非常感謝本書的每一位審閲者併感謝對本書給出了重要的建議的Brian Goetz、Corey Kosak、Arnold Robbins、Josh Bleecher Snyder和Peter Weinberger等人。
我們還感謝Sameer Ajmani、Ittai Balaban、David Crawshaw、Billy Donohue、Jonathan Feinberg、Andrew Gerrand、Robert Griesemer、John Linderman、Minux Ma譯註中国人Go糰隊成員。、Bryan Mills、Bala Natarajan、Cosmos Nicolaou、Paul Staniforth、Nigel Tao譯註好像是陶哲軒的兄弟以及Howard Trickey給出的許多有價值的建議。我們還要感謝David Brailsford和Raph Levien關於類型設置的建議。 我們還感謝Sameer Ajmani、Ittai Balaban、David Crawshaw、Billy Donohue、Jonathan Feinberg、Andrew Gerrand、Robert Griesemer、John Linderman、Minux Ma譯註中国人Go糰隊成員。、Bryan Mills、Bala Natarajan、Cosmos Nicolaou、Paul Staniforth、Nigel Tao譯註好像是陶哲軒的兄弟以及Howard Trickey給出的許多有價值的建議。我們還要感謝David Brailsford和Raph Levien關於類型設置的建議。

View File

@ -1,6 +1,6 @@
## 1.1. Hello, World ## 1.1. Hello, World
我們以1978年出版的C語言聖經[《The C Programming Language》](http://s3-us-west-2.amazonaws.com/belllabs-microsite-dritchie/cbook/index.html)中經典的“hello world”案例來開始吧譯註本書作者之一Brian W. Kernighan也是C語言聖經一書的作者。C語言對Go語言的設計産生了很多影響。用這個例子我們來講解一些Go語言的心特性: 我們以1978年出版的C語言聖經[《The C Programming Language》](http://s3-us-west-2.amazonaws.com/belllabs-microsite-dritchie/cbook/index.html)中經典的“hello world”案例來開始吧譯註本書作者之一Brian W. Kernighan也是C語言聖經一書的作者。C語言對Go語言的設計産生了很多影響。用這個例子我們來講解一些Go語言的心特性:
```go ```go
gopl.io/ch1/helloworld gopl.io/ch1/helloworld

View File

@ -123,5 +123,5 @@ w.X = 8 // equivalent to w.circle.point.X = 8
到目前未知,我們看到匿名成員特性隻是對訪問嵌套成員的點運算符提供了簡短的語法醣。稍後,我們將會看到匿名成員併不要求是結構體類型;其實任何命令的類型都可以作爲結構體的匿名成員。但是爲什麽要嵌入一個沒有任何子成員類型的匿名成員類型呢? 到目前未知,我們看到匿名成員特性隻是對訪問嵌套成員的點運算符提供了簡短的語法醣。稍後,我們將會看到匿名成員併不要求是結構體類型;其實任何命令的類型都可以作爲結構體的匿名成員。但是爲什麽要嵌入一個沒有任何子成員類型的匿名成員類型呢?
答案是匿名類型的方法集。簡短的點運算符語法可以用於選擇匿名成員嵌套的成員也可以用於訪問它們的方法。實際上外層的結構體不僅僅是獲得了匿名成員類型的所有成員而且也獲得了該類型導出的全部的方法。這個機製可以用於將一個有簡單行爲的對象組合成有複雜行爲的對象。組合是Go語言中面向對象編程的我們將在6.3節中專門討論。 答案是匿名類型的方法集。簡短的點運算符語法可以用於選擇匿名成員嵌套的成員也可以用於訪問它們的方法。實際上外層的結構體不僅僅是獲得了匿名成員類型的所有成員而且也獲得了該類型導出的全部的方法。這個機製可以用於將一個有簡單行爲的對象組合成有複雜行爲的對象。組合是Go語言中面向對象編程的我們將在6.3節中專門討論。

View File

@ -27,7 +27,7 @@ func makeThumbnails(filenames []string) {
顯然我們處理文件的順序無關緊要,因爲每一個圖片的拉伸操作和其它圖片的處理操作都是彼此獨立的。像這種子問題都是完全彼此獨立的問題被叫做易併行問題(譯註embarrassingly parallel直譯的話更像是尷尬併行)。易併行問題是最容易被實現成併行的一類問題(廢話),併且是最能夠享受併發帶來的好處,能夠隨着併行的規模線性地擴展。 顯然我們處理文件的順序無關緊要,因爲每一個圖片的拉伸操作和其它圖片的處理操作都是彼此獨立的。像這種子問題都是完全彼此獨立的問題被叫做易併行問題(譯註embarrassingly parallel直譯的話更像是尷尬併行)。易併行問題是最容易被實現成併行的一類問題(廢話),併且是最能夠享受併發帶來的好處,能夠隨着併行的規模線性地擴展。
下面讓我們併行地執行這些操作從而將文件IO的延遲隱藏掉併用上多cpu的計算能力來拉伸圖像。我們的第一個併發程序隻是使用了一個go關鍵字。這里我們先忽略掉錯誤之後再進行處理。 下面讓我們併行地執行這些操作從而將文件IO的延遲隱藏掉併用上多cpu的計算能力來拉伸圖像。我們的第一個併發程序隻是使用了一個go關鍵字。這里我們先忽略掉錯誤之後再進行處理。
```go ```go
// NOTE: incorrect! // NOTE: incorrect!
@ -186,4 +186,4 @@ sizes channel攜帶了每一個文件的大小到main goroutine在main gorout
練習8.4: 脩改reverb2服務器在每一個連接中使用sync.WaitGroup來計數活躍的echo goroutine。當計數減爲零時關閉TCP連接的寫入像練習8.3中一樣。驗證一下你的脩改版netcat3客戶端會一直等待所有的併發“喊叫”完成卽使是在標準輸入流已經關閉的情況下。 練習8.4: 脩改reverb2服務器在每一個連接中使用sync.WaitGroup來計數活躍的echo goroutine。當計數減爲零時關閉TCP連接的寫入像練習8.3中一樣。驗證一下你的脩改版netcat3客戶端會一直等待所有的併發“喊叫”完成卽使是在標準輸入流已經關閉的情況下。
練習8.5: 使用一個已有的CPU綁定的順序程序比如在3.3節中我們寫的Mandelbrot程序或者3.2節中的3-D surface計算程序併將他們的主循環改爲併發形式使用channel來進行通信。在多計算機上這個程序得到了多少速度上的改進使用多少個goroutine是最合適的呢 練習8.5: 使用一個已有的CPU綁定的順序程序比如在3.3節中我們寫的Mandelbrot程序或者3.2節中的3-D surface計算程序併將他們的主循環改爲併發形式使用channel來進行通信。在多計算機上這個程序得到了多少速度上的改進使用多少個goroutine是最合適的呢

View File

@ -59,7 +59,7 @@ https://golang.org/blog/
最初的錯誤信息是一個讓人莫名的DNS査找失敗卽使這個域名是完全可靠的。而隨後的錯誤信息揭示了原因這個程序一次性創建了太多網絡連接超過了每一個進程的打開文件數限製旣而導致了在調用net.Dial像DNS査找失敗這樣的問題。 最初的錯誤信息是一個讓人莫名的DNS査找失敗卽使這個域名是完全可靠的。而隨後的錯誤信息揭示了原因這個程序一次性創建了太多網絡連接超過了每一個進程的打開文件數限製旣而導致了在調用net.Dial像DNS査找失敗這樣的問題。
這個程序實在是太他媽併行了。無窮無盡地併行化併不是什麽好事情因爲不管怎麽説你的繫統總是會有一個些限製因素比如CPU心數會限製你的計算負載比如你的硬盤轉軸和磁頭數限製了你的本地磁盤IO操作頻率比如你的網絡帶寬限製了你的下載速度上限或者是你的一個web服務的服務容量上限等等。爲了解決這個問題我們可以限製併發程序所使用的資源來使之適應自己的運行環境。對於我們的例子來説最簡單的方法就是限製對links.Extract在同一時間最多不會有超過n次調用這里的n是fd的limit-20一般情況下。這個一個夜店里限製客人數目是一個道理隻有當有客人離開時才會允許新的客人進入店內(譯註:作者你個老流氓)。 這個程序實在是太他媽併行了。無窮無盡地併行化併不是什麽好事情因爲不管怎麽説你的繫統總是會有一個些限製因素比如CPU心數會限製你的計算負載比如你的硬盤轉軸和磁頭數限製了你的本地磁盤IO操作頻率比如你的網絡帶寬限製了你的下載速度上限或者是你的一個web服務的服務容量上限等等。爲了解決這個問題我們可以限製併發程序所使用的資源來使之適應自己的運行環境。對於我們的例子來説最簡單的方法就是限製對links.Extract在同一時間最多不會有超過n次調用這里的n是fd的limit-20一般情況下。這個一個夜店里限製客人數目是一個道理隻有當有客人離開時才會允許新的客人進入店內(譯註:作者你個老流氓)。
我們可以用一個有容量限製的buffered channel來控製併發這類似於操作繫統里的計數信號量概念。從概念上講channel里的n個空槽代表n個可以處理內容的token(通行證)從channel里接收一個值會釋放其中的一個token併且生成一個新的空槽位。這樣保證了在沒有接收介入時最多有n個發送操作。(這里可能我們拿channel里填充的槽來做token更直觀一些不過還是這樣吧~)。由於channel里的元素類型併不重要我們用一個零值的struct{}來作爲其元素。 我們可以用一個有容量限製的buffered channel來控製併發這類似於操作繫統里的計數信號量概念。從概念上講channel里的n個空槽代表n個可以處理內容的token(通行證)從channel里接收一個值會釋放其中的一個token併且生成一個新的空槽位。這樣保證了在沒有接收介入時最多有n個發送操作。(這里可能我們拿channel里填充的槽來做token更直觀一些不過還是這樣吧~)。由於channel里的元素類型併不重要我們用一個零值的struct{}來作爲其元素。

View File

@ -1,6 +1,6 @@
# 第八章 Goroutines和Channels # 第八章 Goroutines和Channels
併發程序指的是同時做好幾件事情的程序隨着硬件的發展併發程序顯得越來越重要。Web服務器會一次處理成韆上萬的請求。平闆電腦和手機app在渲染用戶動畵的同時還會後台執行各種計算任務和網絡請求。卽使是傳統的批處理問題--讀取數據,計算,寫輸出--現在也會用併發來隱藏掉I/O的操作延遲充分利用現代計算機設備的多,盡管計算機的性能每年都在增長,但併不是線性。 併發程序指的是同時做好幾件事情的程序隨着硬件的發展併發程序顯得越來越重要。Web服務器會一次處理成韆上萬的請求。平闆電腦和手機app在渲染用戶動畵的同時還會後台執行各種計算任務和網絡請求。卽使是傳統的批處理問題--讀取數據,計算,寫輸出--現在也會用併發來隱藏掉I/O的操作延遲充分利用現代計算機設備的多,盡管計算機的性能每年都在增長,但併不是線性。
Go語言中的併發程序可以用兩種手段來實現。這一章會講解goroutine和channel其支持“順序進程通信”(communicating sequential processes)或被簡稱爲CSP。CSP是一個現代的併發編程模型在這種編程模型中值會在不同的運行實例(goroutine)中傳遞盡管大多數情況下被限製在單一實例中。第9章會覆蓋到更爲傳統的併發模型多線程共享內存如果你在其它的主流語言中寫過併發程序的話可能會更熟悉一些。第9章同時會講一些本章不會深入的併發程序帶來的重要風險和陷阱。 Go語言中的併發程序可以用兩種手段來實現。這一章會講解goroutine和channel其支持“順序進程通信”(communicating sequential processes)或被簡稱爲CSP。CSP是一個現代的併發編程模型在這種編程模型中值會在不同的運行實例(goroutine)中傳遞盡管大多數情況下被限製在單一實例中。第9章會覆蓋到更爲傳統的併發模型多線程共享內存如果你在其它的主流語言中寫過併發程序的話可能會更熟悉一些。第9章同時會講一些本章不會深入的併發程序帶來的重要風險和陷阱。

View File

@ -133,10 +133,11 @@ var _RegexpLinksTable = func() map[*regexp.Regexp]string {
var _LinkTable = map[string]string{ var _LinkTable = map[string]string{
// 人名 // 人名
"Alan Donovan": "https://github.com/adonovan", "Alan Donovan": "https://github.com/adonovan",
"Brian Kernighan": "http://www.cs.princeton.edu/~bwk/", "Brian Kernighan": "http://www.cs.princeton.edu/~bwk/",
"Alan A. A. Donovan": "https://github.com/adonovan", "Alan A. A. Donovan": "https://github.com/adonovan",
"Brian W. Kernighan": "http://www.cs.princeton.edu/~bwk/", "Brian W. Kernighan": "http://www.cs.princeton.edu/~bwk/",
"Dennis M. Ritchie": "http://genius.cat-v.org/dennis-ritchie/",
"Robert Griesemer": "http://research.google.com/pubs/author96.html", "Robert Griesemer": "http://research.google.com/pubs/author96.html",
"Rob Pike": "http://genius.cat-v.org/rob-pike/", "Rob Pike": "http://genius.cat-v.org/rob-pike/",
"Ken Thompson": "http://genius.cat-v.org/ken-thompson/", "Ken Thompson": "http://genius.cat-v.org/ken-thompson/",
@ -183,4 +184,5 @@ var _LinkTable = map[string]string{
"Bell Labs": "http://www.cs.bell-labs.com/", "Bell Labs": "http://www.cs.bell-labs.com/",
"communicating sequential processes": "https://en.wikipedia.org/wiki/Communicating_sequential_processes", "communicating sequential processes": "https://en.wikipedia.org/wiki/Communicating_sequential_processes",
"CSP": "https://en.wikipedia.org/wiki/Communicating_sequential_processes", "CSP": "https://en.wikipedia.org/wiki/Communicating_sequential_processes",
"K&R": "https://en.wikipedia.org/wiki/K%26R",
} }

View File

@ -23,21 +23,21 @@ Go語言聖經 [《The Go Programming Language》](http://gopl.io) 中文版本
# 譯者序 # 譯者序
在上個世紀70年代貝爾實驗室的Ken Thompson和Dennis M. Ritchie合作發明了UNIX操作繫統同時Dennis M. Ritchie爲了解決UNIX繫統的移植性問題而發明了C語言貝爾實驗室的UNIX和C語言兩大發明奠定了整個現代IT行業最重要的軟件基礎目前的三大桌面操作繫統的中Linux和Mac OS X都是源於UINX繫統兩大移動平台的操作繫統iOS和Android也都是源於UNIX繫統。C繫家族的編程語言占據統治地位達幾十年之久。在UINX和C語言發明40年之後目前已經在Google工作的Ken Thompson和Rob Pike他們在貝爾實驗室時就是同事、同樣還有Robert Griesemer一起合作爲了解決21世紀的多覈和網絡化編程問題而發明了Go語言。從Go語言庫早期代碼庫日誌可以看出它的演化歷程 在上個世紀70年代貝爾實驗室的[Ken Thompson](http://genius.cat-v.org/ken-thompson/)[Dennis M. Ritchie](http://genius.cat-v.org/dennis-ritchie/)合作發明了[UNIX](http://doc.cat-v.org/unix/)操作繫統,同時[Dennis M. Ritchie](http://genius.cat-v.org/dennis-ritchie/)爲了解決[UNIX](http://doc.cat-v.org/unix/)繫統的移植性問題而發明了C語言貝爾實驗室的[UNIX](http://doc.cat-v.org/unix/)和C語言兩大發明奠定了整個現代IT行業最重要的軟件基礎目前的三大桌面操作繫統的中[Linux](http://www.linux.org/)[Mac OS X](http://www.apple.com/cn/osx/)都是源於[UINX]()繫統兩大移動平台的操作繫統iOS和Android也都是源於[UNIX](http://doc.cat-v.org/unix/)繫統。C繫家族的編程語言占據統治地位達幾十年之久。在[UINX]()和C語言發明40年之後目前已經在Google工作的[Ken Thompson](http://genius.cat-v.org/ken-thompson/)和[Rob Pike](http://genius.cat-v.org/rob-pike/)(他們在貝爾實驗室時就是同事)、還有[Robert Griesemer](http://research.google.com/pubs/author96.html)一起合作爲了解決在21世紀多核和網絡化環境下越來越複雜的編程問題而發明了Go語言。從Go語言庫早期代碼庫日誌可以看出它的演化歷程
![](./images/go-log04.png) ![](./images/go-log04.png)
從早期提交日誌中也可以看出Go語言是從Ken Thompson發明的B語言、Dennis M. Ritchie發明的C語言逐步演化過來的是C語言家族的成員因此很多人將Go語言稱爲21世紀的C語言。 從早期提交日誌中也可以看出Go語言是從[Ken Thompson](http://genius.cat-v.org/ken-thompson/)發明的B語言、[Dennis M. Ritchie](http://genius.cat-v.org/dennis-ritchie/)發明的C語言逐步演化過來的是C語言家族的成員因此很多人將Go語言稱爲21世紀的C語言。
在C語言發明之後約5年的時間之後1978年Brian W. Kernighan和Dennis M. Ritchie合作編寫出版了C語言方面的經典敎材《The C Programming Language》該書被譽爲C語言程序員的聖經作者也被大家親切地稱爲K&R。同樣在Go語言正式發布2009年約5年之後2014年開始寫作2015年出版由Go語言覈心糰隊成員Alan A. A. Donovan和K&R中的Brian W. Kernighan合作編寫了Go語言方面的經典敎材《The Go Programming Language》。Go語言被譽爲21世紀的C語言如果説K&R所著的是聖經的舊約那麽D&K所著的必將成爲聖經的新約。該書介紹了Go語言幾乎全部特性併且隨着語言的深入層層遞進對每個細節都解讀得非常細致每一節內容都精綵不容錯過是廣大Gopher的必讀書目。同時大部分Go語言心糰隊的成員都參與了該書校對工作,因此該書的質量是可以完全放心的。 在C語言發明之後約5年的時間之後1978年[Brian W. Kernighan](http://www.cs.princeton.edu/~bwk/)[Dennis M. Ritchie](http://genius.cat-v.org/dennis-ritchie/)合作編寫出版了C語言方面的經典敎材《[The C Programming Language](The C Programming Language)該書被譽爲C語言程序員的聖經作者也被大家親切地稱爲[K&R](https://en.wikipedia.org/wiki/K%26R)。同樣在Go語言正式發布2009年約5年之後2014年開始寫作2015年出版由Go語言核心糰隊成員[Alan A. A. Donovan](https://github.com/adonovan)和[K&R](https://en.wikipedia.org/wiki/K%26R)中的[Brian W. Kernighan](http://www.cs.princeton.edu/~bwk/)合作編寫了Go語言方面的經典敎材《[The Go Programming Language](http://gopl.io)》。Go語言被譽爲21世紀的C語言如果説K&R所著的是聖經的舊約那麽D&K所著的必將成爲聖經的新約。該書介紹了Go語言幾乎全部特性併且隨着語言的深入層層遞進對每個細節都解讀得非常細致每一節內容都精綵不容錯過是廣大Gopher的必讀書目。同時大部分Go語言心糰隊的成員都參與了該書校對工作,因此該書的質量是可以完全放心的。
同時單憑閲讀和學習其語法結構併不能眞正地掌握一門編程語言必鬚進行足夠多的編程實踐——親自編寫一些程序併研究學習别人寫的程序。要從利用Go語言良好的特性使得程序模塊化充分利用Go的標準函數庫以Go語言自己的風格來編寫程序。書中包含了上百個精心挑選的習題希望大家能先用自己的方式嚐試完成習題然後再參考官方給出的解決方案。 同時單憑閲讀和學習其語法結構併不能眞正地掌握一門編程語言必鬚進行足夠多的編程實踐——親自編寫一些程序併研究學習别人寫的程序。要從利用Go語言良好的特性使得程序模塊化充分利用Go的標準函數庫以Go語言自己的風格來編寫程序。書中包含了上百個精心挑選的習題希望大家能先用自己的方式嚐試完成習題然後再參考官方給出的解決方案。
該書英文版約從2015年10月開始公開發售同時同步發售的還有日文版本。不過比較可惜的是中文版併沒有在同步發售之列甚至連中文版是否會引進、卽使引進將由何人翻譯、何時出版都成了一個祕密。中国的Go語言社區是全球最大的Go語言社區我們一直在緊跟Go語言發展的腳步。我們應該也完全有能力以Go語言社區的力量同步完成Go語言聖經中文版的翻譯工作。與此同時国內有很多Go語言愛好者也在積極關註該書本人也在第一時間購買了紙質版本亞馬遜價格314人民幣。爲了Go語言的學習和交流大家決定合作免費翻譯該書。 該書英文版約從2015年10月開始公開發售同時同步發售的還有日文版本。不過比較可惜的是中文版併沒有在同步發售之列甚至連中文版是否會引進、是由哪個出版社引進、卽使引進將由何人翻譯、何時出版都成了一個祕密。中国的Go語言社區是全球最大的Go語言社區我們從一開始就始終緊跟着Go語言的發展腳步。我們應該也完全有能力以中国Go語言社區的力量同步完成Go語言聖經中文版的翻譯工作。與此同時国內有很多Go語言愛好者也在積極關註該書本人也在第一時間購買了紙質版本亞馬遜價格314人民幣。爲了Go語言的學習和交流大家決定合作免費翻譯該書。
翻譯工作從2015年11月20日前後開始到2016年1月底初步完成前後歷時約2個月時間。其中chai2010翻譯了前言、第2~4章、第10~13章Xargin翻譯了第1章、第6章、第8~9章CrazySssst翻譯了第5章foreversmart翻譯了第7章大家一起參與了基本的校驗工作還有其他一些朋友提供了積極的反饋建議。如果大家有任何問題或建議可以直接到中文版項目頁面提交Issue如果發現英文原文有錯誤可以直接去英文版項目提交。 翻譯工作從2015年11月20日前後開始到2016年1月底初步完成前後歷時約2個月時間。其中[chai2010](https://github.com/chai2010)翻譯了前言、第2~4章、第10~13章[Xargin](https://github.com/cch123)翻譯了第1章、第6章、第8~9章[CrazySssst](https://github.com/CrazySssst)翻譯了第5章[foreversmart](https://github.com/foreversmart)翻譯了第7章大家共同參與了基本的校驗工作,還有其他一些朋友提供了積極的反饋建議。如果大家有任何問題或建議可以直接到中文版項目頁面提交Issue如果發現英文原文有任何勘誤中未提到的錯誤,可以直接去英文版項目提交。
最後,希望這本書能夠幫助大家成爲Go語言的高手 最後,希望這本書能夠幫助大家用Go語言快樂地編程
2016年 1月 於 武漢 2016年 1月 於 武漢

View File

@ -206,6 +206,7 @@ var zh2twMapPatch = map[rune]rune{
'台': '台', '台': '台',
'国': '国', '国': '国',
'获': '獲', '获': '獲',
'核': '核',
} }
var _TSCharactersMap = map[rune]rune{ var _TSCharactersMap = map[rune]rune{