make loop

This commit is contained in:
chai2010
2015-12-18 14:49:31 +08:00
parent 9fde1ff772
commit f9ac065e47
106 changed files with 725 additions and 725 deletions

View File

@@ -1,20 +1,20 @@
## Go語言起源
就像生物物種, 一個成功的編程語言的後代一般都會繼承它們祖先的優點; 當然有時多種語言混合也會生令人驚訝的特性; 還有一些激進的新特性可能沒有先例. 我們可以通過觀察語言的和環境是如何相互促進和影響的演化過程而學到很多.
就像生物物種, 一個成功的編程語言的後代一般都會繼承它們祖先的優點; 當然有時多種語言混合也會生令人驚訝的特性; 還有一些激進的新特性可能沒有先例. 我們可以通過觀察語言的和環境是如何相互促進和影響的演化過程而學到很多.
下圖展示了最早期的編程語言對Go語言設計生的重要影響.
下圖展示了最早期的編程語言對Go語言設計生的重要影響.
![](../images/ch0-01.png)
Go有時候被描述爲"C類似語言", 或者是"21世紀的C語言". Go從C語言繼承了相似的表達式語法, 控製流結構, 基礎數據類型, 調用參數傳值, 指等很多思想, 還有C語言一直看中的編譯後機器碼的運行效率以及和現有操作繫統的無縫的適配.
Go有時候被描述爲"C類似語言", 或者是"21世紀的C語言". Go從C語言繼承了相似的表達式語法, 控製流結構, 基礎數據類型, 調用參數傳值, 指等很多思想, 還有C語言一直看中的編譯後機器碼的運行效率以及和現有操作繫統的無縫的適配.
但是在Go語言的族樹中還有其他的祖先. 其中一個有影響的分支來自Niklaus Wirth設計的Pascal語言. Modula-2 激發了包的概. Oberon 摒棄了模塊接口文件和模塊實現文件之間的區. Oberon-2 影響了的包的導入和聲明的語法, 還有 面向對象 Oberon 所提供的方法的聲明語法等.
但是在Go語言的族樹中還有其他的祖先. 其中一個有影響的分支來自Niklaus Wirth設計的Pascal語言. Modula-2 激發了包的概. Oberon 摒棄了模塊接口文件和模塊實現文件之間的區. Oberon-2 影響了的包的導入和聲明的語法, 還有 面向對象 Oberon 所提供的方法的聲明語法等.
Go的另一支祖先, 也是Go區其他語言的重要特性, 靈感來自貝爾實驗室的Tony Hoare的1978年發表的鮮爲外界所知的關於發研究的基礎文獻communicating sequential processes (CSP). 在CSP中, 程序是一組中間沒有共享狀態的平行的處理過程, 它們使用管道進行通信和同步. 不過Tony Hoare的CSP隻是一個用於描述發性基本概的描述語言, 不是一個編寫可執行程序的編程語言.
Go的另一支祖先, 也是Go區其他語言的重要特性, 靈感來自貝爾實驗室的Tony Hoare的1978年發表的鮮爲外界所知的關於發研究的基礎文獻communicating sequential processes (CSP). 在CSP中, 程序是一組中間沒有共享狀態的平行的處理過程, 它們使用管道進行通信和同步. 不過Tony Hoare的CSP隻是一個用於描述發性基本概的描述語言, 不是一個編寫可執行程序的編程語言.
Rob Pike和其他人開始試將CSP引入實際的編程語言中. 第一個語言叫Squeak(老鼠間交流的語言), 一個提供鼠標和鍵盤事件處理的語言, 它的管道是靜態創建的. 然後是Newsqueak, 提供了類似C語言語句和表達式的的語法和Pascal的類似推導語法. 它是一個帶垃圾迴收的純函數式語言, 再此對管理鍵盤, 鼠標和窗口事件管理. 但是Newsqueak中管道是動態創建的, 屬於第一類值, 可以保存到變量中.
Rob Pike和其他人開始試將CSP引入實際的編程語言中. 第一個語言叫Squeak(老鼠間交流的語言), 一個提供鼠標和鍵盤事件處理的語言, 它的管道是靜態創建的. 然後是Newsqueak, 提供了類似C語言語句和表達式的的語法和Pascal的類似推導語法. 它是一個帶垃圾迴收的純函數式語言, 再此對管理鍵盤, 鼠標和窗口事件管理. 但是Newsqueak中管道是動態創建的, 屬於第一類值, 可以保存到變量中.
在Plan9操作繫統中, 這些想法被吸收到一個叫Alef的編程語言中. Alef視圖將Newsqueak改造爲繫統編程語言, 但是因爲缺少垃圾迴收機製而導緻並發處理很痛苦.
在Plan9操作繫統中, 這些想法被吸收到一個叫Alef的編程語言中. Alef視圖將Newsqueak改造爲繫統編程語言, 但是因爲缺少垃圾迴收機製而導致併發處理很痛苦.
Go的其他一些特性零散地來着其他的一些語言; 比如 iota 從 APL 借鑒, 詞法作用域與嵌套函數來自 Scheme (和其他很多語言). 我們也可以從Go中發現很多創新的設計. 比如Go的切片爲動態數組提供了有效的隨機存取性能, 以及可能會讓人聯想到鏈表的底層的共享機製.
還有Go自己發明的defer語句.

View File

@@ -1,17 +1,17 @@
## Go語言項目
所有的編程語言都反映了設計者對編程哲學的反思, 通常包括之前的語言所暴露的一些不足的地方.
Go項目是在Google超級雜的幾個軟件繫統遇到的一些問題的反思(但是這個問題不是歌特有的).
Go項目是在Google超級雜的幾個軟件繫統遇到的一些問題的反思(但是這個問題不是歌特有的).
正如Rob Pike所, “雜性是乘法級相關的”, 通過增加一個部分的雜性來脩問題通常將慢慢地增加其他部分的雜性. 通過增加功能和選項和配置是脩問題的最快的途徑, 但是這很容易忽略簡潔的內涵, 卽使從長遠來看, 簡潔依然是好的軟件關鍵因素.
正如Rob Pike所, “雜性是乘法級相關的”, 通過增加一個部分的雜性來脩問題通常將慢慢地增加其他部分的雜性. 通過增加功能和選項和配置是脩問題的最快的途徑, 但是這很容易忽略簡潔的內涵, 卽使從長遠來看, 簡潔依然是好的軟件關鍵因素.
簡潔需要在工作開始的時候減少不必要的想法, 且在軟件的生命週期內嚴格區好的改變或壞的改變. 通過足夠的努力, 一個好的改變可以在不破壞完整概的前提下保持自適應, 正如 Fred Brooks 所的 "概完整性"; 而一個壞的改變則不能, 它們僅僅是通過膚淺的簡單的妥協來破壞設計的一性. 隻有通過簡潔的設計, 纔能讓一個繫統保持穩定, 安全, 和持續的生長.
簡潔需要在工作開始的時候減少不必要的想法, 且在軟件的生命週期內嚴格區好的改變或壞的改變. 通過足夠的努力, 一個好的改變可以在不破壞完整概的前提下保持自適應, 正如 Fred Brooks 所的 "概完整性"; 而一個壞的改變則不能, 它們僅僅是通過膚淺的簡單的妥協來破壞設計的一性. 隻有通過簡潔的設計, 纔能讓一個繫統保持穩定, 安全, 和持續的生長.
Go項目包括語言本身, 附帶的工具和標準庫, 最後但非不重要的, 簡潔編程哲學的宣言. 就事後的目光來看, Go的這些地方都做的不錯: 擁有自動垃圾迴收, 一個包繫統, 函數作爲一等公民, 詞法作用域, 繫統調用接口, 隻讀的UTF8字符串. 但是Go隻有相對較少的特性, 也不太可能對添加更多. 例如, 它沒有隱式的數值轉換, 沒有構造函數和析構函數, 沒有運算符重載, 沒有默認參數, 沒有繼承, 沒有型, 沒有異常, 沒有宏, 沒有函數脩飾, 沒有綫程侷部存儲. 但是語言是成熟和穩定的, 而且保向後兼容: 以前的Go程序可以用新版本的編譯器和標準庫下構建.
Go項目包括語言本身, 附帶的工具和標準庫, 最後但非不重要的, 簡潔編程哲學的宣言. 就事後的目光來看, Go的這些地方都做的不錯: 擁有自動垃圾迴收, 一個包繫統, 函數作爲一等公民, 詞法作用域, 繫統調用接口, 隻讀的UTF8字符串. 但是Go隻有相對較少的特性, 也不太可能對添加更多. 例如, 它沒有隱式的數值轉換, 沒有構造函數和析構函數, 沒有運算符重載, 沒有默認參數, 沒有繼承, 沒有型, 沒有異常, 沒有宏, 沒有函數脩飾, 沒有線程局部存儲. 但是語言是成熟和穩定的, 而且保向後兼容: 以前的Go程序可以用新版本的編譯器和標準庫下構建.
Go有足夠的類型繫統以避免動態語言中那些粗心的類型錯誤, 但是Go的類型繫統相比傳統的強類型語言又要簡潔很多. 有時候這會導一個"無類型"的抽象類型, 但是Go程序員不需要像 C++ 或 Haskell 程序員那樣糾結具體類型的安全屬性. 但實踐中Go的簡潔的類型繫統給了程序員更多的安全性和更好的運行時性能.
Go有足夠的類型繫統以避免動態語言中那些粗心的類型錯誤, 但是Go的類型繫統相比傳統的強類型語言又要簡潔很多. 有時候這會導一個"無類型"的抽象類型, 但是Go程序員不需要像 C++ 或 Haskell 程序員那樣糾結具體類型的安全屬性. 但實踐中Go的簡潔的類型繫統給了程序員更多的安全性和更好的運行時性能.
Go 鼓勵當代計算機繫統設計的認識, 特別是侷部的重要性. 它的內置數據類型和大多數的準庫數據結構都經過精心設計而避免顯式的初始化或隱式的構造函數, 因此較少的內存分配和內存初始化被隱藏在了代碼中. Go的聚合類型(結構體和數組)直接操作它們的元素, 需要更少的存儲空間, 更少的內存分配, 而且指操作比其他間接語言也更直接. 由於現代計算機是一個行的機器, Go提供了基於CSP的發特性. Go的動態棧使得輕量級程goroutine的初始棧很小, 創建一個goroutine的代價很小, 因此創建百萬級的goroutine是可行的.
Go 鼓勵當代計算機繫統設計的認識, 特别是局部的重要性. 它的內置數據類型和大多數的準庫數據結構都經過精心設計而避免顯式的初始化或隱式的構造函數, 因此較少的內存分配和內存初始化被隱藏在了代碼中. Go的聚合類型(結構體和數組)直接操作它們的元素, 需要更少的存儲空間, 更少的內存分配, 而且指操作比其他間接語言也更直接. 由於現代計算機是一個行的機器, Go提供了基於CSP的發特性. Go的動態棧使得輕量級程goroutine的初始棧很小, 創建一個goroutine的代價很小, 因此創建百萬級的goroutine是可行的.
Go的標準庫(通常被稱爲自帶的電池), 提供了清晰的構建模塊和接口, 包含 I/O, 文本處理, 圖像, 密碼學, 網絡, 和分式應用程序, 支持許多標準的文件格式和協議. 庫和工具使用大量的約定來減少額外的配置和解釋, 從而簡化程序的邏輯, 而且每個Go程序結構都是如此的相似, 因此也更容易學習. 構建項目使用的Go工具隻使用文件名和標識符名稱, 一個偶爾的特殊註釋來確定所有的庫, 可執行文件, 測試, 基準測試, 例子, 特定於平的變量, 項目的文檔; Go源代碼本身包含構建規.
Go的標準庫(通常被稱爲自帶的電池), 提供了清晰的構建模塊和接口, 包含 I/O, 文本處理, 圖像, 密碼學, 網絡, 和分式應用程序, 支持許多標準的文件格式和協議. 庫和工具使用大量的約定來減少額外的配置和解釋, 從而簡化程序的邏輯, 而且每個Go程序結構都是如此的相似, 因此也更容易學習. 構建項目使用的Go工具隻使用文件名和標識符名稱, 一個偶爾的特殊註釋來確定所有的庫, 可執行文件, 測試, 基準測試, 例子, 特定於平的變量, 項目的文檔; Go源代碼本身包含構建規.

View File

@@ -1,41 +1,41 @@
## 本書的組織
我們假設你有一個或多個其他編程語言的使用經, 不過是類似 C、c++,和Java 的編譯型語言,
我們假設你有一個或多個其他編程語言的使用經, 不過是類似 C、c++,和Java 的編譯型語言,
還是類似 Python, Ruby, JavaScript 的腳本語言, 因此我們不會相對完全的編程語言初學者那樣解釋所有的細節.
因爲Go的語言的 變量,常量,表達式,控製流和函數等語法也是類似的.
第一章包含了Go敎程的基本結構, 通過十幾個程序介紹了用Go如何實現 類似讀寫文件, 文本格式化, 創建圖像,
網絡客戶端和服務器通訊 等日常工作.
第二章描述了一個Go程序的基本元素結構, 變量, 定義新的類型, 包和文件, 和作用域. 第三章討論了數字, 爾值, 字符串和常量, 演示了如何顯示和處理Unicode. 第四章描述了合類型, 從簡單的數組, 字典, 切片, 到動態列表. 第五章涵蓋了函數, 討論了錯誤處理, panic 和 recover, 和 defer 語句.
第二章描述了一個Go程序的基本元素結構, 變量, 定義新的類型, 包和文件, 和作用域. 第三章討論了數字, 爾值, 字符串和常量, 演示了如何顯示和處理Unicode. 第四章描述了合類型, 從簡單的數組, 字典, 切片, 到動態列表. 第五章涵蓋了函數, 討論了錯誤處理, panic 和 recover, 和 defer 語句.
第三章討論了數字、爾值、字符串和常數,解釋顯示處理Unicode。
第四章描述了合類型,類型建立使用數組,從簡單的地圖,結構,和切割的方法去動態列表。第五章涵蓋了函數和討論錯誤處理,恐慌和恢,而推遲的陳述。
第三章討論了數字、爾值、字符串和常數,解釋顯示處理Unicode。
第四章描述了合類型,類型建立使用數組,從簡單的地圖,結構,和切割的方法去動態列表。第五章涵蓋了函數和討論錯誤處理,恐慌和恢,而推遲的陳述。
第一章到第五章是基礎部分, 任何主流命令式語言的一部分都是類似的. 雖然有時候Go的語法和風格會有自己的特色, 但是大多數程序員將很快適應.
剩下的章節是Go中特有的部分: 方法, 接口, 發, 包, 測試和反射等.
剩下的章節是Go中特有的部分: 方法, 接口, 發, 包, 測試和反射等.
Go的面向對象是不同尋常的. 它沒有類層次結構, 甚至沒有類; 僅僅是通過組合(而不是繼承)簡單的對象來構建雜的對象.
方法不僅僅可以定義在結構體上, 而是可以在任何用戶自己定義的類型上; 且具體類型和抽象類型(接口)之間的關繫是隱式的,
所以很多類型的設計者可能不知道該類型到底滿足了哪些接口. 方法在第六章討論, 接口在第七章將討論.
Go的面向對象是不同尋常的. 它沒有類層次結構, 甚至沒有類; 僅僅是通過組合(而不是繼承)簡單的對象來構建雜的對象.
方法不僅僅可以定義在結構體上, 而是可以在任何用戶自己定義的類型上; 且具體類型和抽象類型(接口)之間的關繫是隱式的,
所以很多類型的設計者可能不知道該類型到底滿足了哪些接口. 方法在第六章討論, 接口在第七章將討論.
第八章討論了基於順序通信進程(CSP)的概唸的並發編程, 使用 goroutines 和 channels. 第九章討論了更爲傳統的基於共享變量的發性.
第八章討論了基於順序通信進程(CSP)的概念的併發編程, 使用 goroutines 和 channels. 第九章討論了更爲傳統的基於共享變量的發性.
第十章描述了包機製, 包的組織結構. 本章還展示了如何利用有效的利用Go自帶的工具,
通過一個命令提供了編譯, 測試, 基準測試, 代碼格式化, 文檔, 和許多其他任務.
第十一章討論單元測試, Go的工具和標準庫中集成了輕量級的測試功能, 從而避免了採用復雜強大的測試框架. 測試庫提供一些基本的構建, 如果有必要可以構建更雜的測試抽象.
第十一章討論單元測試, Go的工具和標準庫中集成了輕量級的測試功能, 從而避免了采用複雜強大的測試框架. 測試庫提供一些基本的構建, 如果有必要可以構建更雜的測試抽象.
第十二章討論了反射, 一個程序在運行期間來檢視自己的能力. 反射是一個強大的工具, 不過要謹慎地使用; 本章通過用反射實現一些重要的Go庫來展示了反射的用法. 第十三章解釋了低級編程的細節, 通過使用 unsafe 包來繞過Go的類型繫統, 有時這是必要的.
每一章會有一些練習, 你可以根據你對Go語言的理解, 然後脩改書中的例子來探索Go的其他用法.
書中所有的代碼都可以從 gopl.io 上的 Git 倉庫下載. go get可以根據每個例子的其導入路徑方便地取/構建/安裝. 你需要選擇一個目録作爲工作空間, 然後將GOPATH環境指向這個工作目録.
書中所有的代碼都可以從 gopl.io 上的 Git 倉庫下載. go get可以根據每個例子的其導入路徑方便地取/構建/安裝. 你需要選擇一個目録作爲工作空間, 然後將GOPATH環境指向這個工作目録.
Go工具將在必要時創建的相應的目録. 例如:
$ export GOPATH=$HOME/gobook # 選擇工作目録
$ go get gopl.io/ch1/helloworld # 取/編譯/安裝
$ go get gopl.io/ch1/helloworld # 取/編譯/安裝
$ $GOPATH/bin/helloworld # 運行
Hello, 世界 # 這是中文, 不是日文
@@ -44,5 +44,5 @@ Go工具將在必要時創建的相應的目録. 例如:
$ go version
go version go1.5 linux/amd64
如果你用的是其他的操作繫統, 請參考 https://golang.org/doc/install 提供的明安裝.
如果你用的是其他的操作繫統, 請參考 https://golang.org/doc/install 提供的明安裝.

View File

@@ -1,14 +1,14 @@
## 更多的信息
最佳的信息來自Go的官方網站, https://golang.org, 它提供了訪問完善的參考文檔, 包括編程語言規和標準庫等諸多信息. 同時也包含了如果更好了編寫Go程序的基本敎程, 還有各種各樣的在文本資源和視頻資源, 它們是本身終有價值的補充. Go的博客 blog.golang.org 發一些Go語言最好的實踐文章, 包括當前語言的狀態, 未來的計劃, 會議報告和Go相關的各種主題.
最佳的信息來自Go的官方網站, https://golang.org, 它提供了訪問完善的參考文檔, 包括編程語言規和標準庫等諸多信息. 同時也包含了如果更好了編寫Go程序的基本敎程, 還有各種各樣的在文本資源和視頻資源, 它們是本身終有價值的補充. Go的博客 blog.golang.org 發一些Go語言最好的實踐文章, 包括當前語言的狀態, 未來的計劃, 會議報告和Go相關的各種主題.
訪問的一個有價值的地方是可以從web頁面運行Go的程序(而紙質書則沒有這麽便利了). 這個功能 由來自 play.golang.org 的 Go Playground 提供, 且可以方便地嵌入到其他頁面, 例如 golang.org 的主頁, 或 godoc 提供的文檔中.
訪問的一個有價值的地方是可以從web頁面運行Go的程序(而紙質書則沒有這麽便利了). 這個功能 由來自 play.golang.org 的 Go Playground 提供, 且可以方便地嵌入到其他頁面, 例如 golang.org 的主頁, 或 godoc 提供的文檔中.
Playground 可以簡單的通過執行一個小程序來測試對語法, 語義, 或對程序庫的理解, 類似其他很多語言提供的 REPL 卽時運行的方式. 同時它可以生成對應的url, 非常適合共享Go代碼片段, bug報告或提齣建議.
基於 Playground 構建的 Go Tour (tour.golang.org), 是一個繫列的Go入門敎程, 包含了諸多基本概和結構相關的可在運行的互動小程序.
基於 Playground 構建的 Go Tour (tour.golang.org), 是一個繫列的Go入門敎程, 包含了諸多基本概和結構相關的可在運行的互動小程序.
Playground 和 Tour 也有一些不足, 它們隻能導入標準庫, 而且因爲安全的原因對一些網絡庫做了限製. 而且要編譯和運行需要訪問互聯網. 對於一些更製的實驗, 你可能需要在自己的電腦上運行程序. 運的是下載Go的過程很簡單, 從 golang.org 下載應該不超過幾分, 然後就可以在自己電腦上編寫和運行Go程序了.
Playground 和 Tour 也有一些不足, 它們隻能導入標準庫, 而且因爲安全的原因對一些網絡庫做了限製. 而且要編譯和運行需要訪問互聯網. 對於一些更製的實驗, 你可能需要在自己的電腦上運行程序. 運的是下載Go的過程很簡單, 從 golang.org 下載應該不超過幾分, 然後就可以在自己電腦上編寫和運行Go程序了.
Go是一個開源項目, 你可以 在 https://golang.org/pkg 讀標準庫中任意函數和類型的代碼, 和下載的代碼完全一. 這樣可以知道很多函數是如何工作的, 挖掘一些答案的細節, 或者僅僅是欣賞 專業的Go代碼.
Go是一個開源項目, 你可以 在 https://golang.org/pkg 讀標準庫中任意函數和類型的代碼, 和下載的代碼完全一. 這樣可以知道很多函數是如何工作的, 挖掘一些答案的細節, 或者僅僅是欣賞 專業的Go代碼.

View File

@@ -1,9 +1,9 @@
##
##
Rob Pike 和 Russ Cox, 以及其他很多Go隊的覈心成員多次仔細讀了本書的手稿,
Rob Pike 和 Russ Cox, 以及其他很多Go隊的覈心成員多次仔細讀了本書的手稿,
他們對本書的組織結構和表述用詞等給齣了很多寶貴的建議. 在準備日本翻譯的時候,
Yoshiki Shibata 更是仔細地審了本書的每個部分, 及時發現了諸多英文和代碼的錯誤.
我們非常感謝本書的審者, 感謝對本書給齣了重要的建議的 Brian Goetz, Corey Kosak,
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,
@@ -12,13 +12,13 @@ Robert Griesemer, John Linderman, Minux Ma, Bryan Mills, Bala Natarajan, Cosmos
我們還要感謝 David Brailsford 和 Raph Levien 關於類型設置的建議.
我們來自 Addison-Wesley 的編輯 Greg Doench, 從最初就得到了越來越多的幫助.
來自AW生產團隊的 John Fuller, Dayna Isley, Julie Nahil, Chuti Prasertsith, 和 Barbara Wood,
來自AW生産糰隊的 John Fuller, Dayna Isley, Julie Nahil, Chuti Prasertsith, 和 Barbara Wood,
感謝你們的熱心幫助.
Alan Donovan 特感謝: Sameer Ajmani, Chris Demetriou, Walt Drummond 和 Google的Reid Tatge 允許他有充裕的時間去寫本書;
感謝 Stephen Donovan 的建議和始終如一的鼓勵, 以及他的妻子 Leila Kazemi 沒有讓他爲了庭瑣事而分心, 熱情堅定地支持這個項目.
Alan Donovan 特感謝: Sameer Ajmani, Chris Demetriou, Walt Drummond 和 Google的Reid Tatge 允許他有充裕的時間去寫本書;
感謝 Stephen Donovan 的建議和始終如一的鼓勵, 以及他的妻子 Leila Kazemi 沒有讓他爲了庭瑣事而分心, 熱情堅定地支持這個項目.
Brian Kernighan特感謝: 朋友和同事的耐心和寬容他, 讓他慢慢地梳理本身的寫作思路.
Brian Kernighan特感謝: 朋友和同事的耐心和寬容他, 讓他慢慢地梳理本身的寫作思路.
同時感謝他的妻子 Meg 和其他很多朋友對他寫作事業的支持.
2015年 10月 於 紐約