ch10-3: review

This commit is contained in:
chai2010 2016-01-08 15:03:39 +08:00
parent 4b87f89d1f
commit 25f3ed912f
2 changed files with 9 additions and 10 deletions

View File

@ -1,6 +1,6 @@
## 10.2. 導入路徑 ## 10.2. 導入路徑
每個包是由一個全局唯一的字符串所標識的導入路徑定位。出現在import句中的導入路徑也是字符串。 每個包是由一個全局唯一的字符串所標識的導入路徑定位。出現在import句中的導入路徑也是字符串。
```Go ```Go
import ( import (
@ -14,6 +14,6 @@ import (
) )
``` ```
就像我們在2.6.1節提到過的Go語言的規范併沒有指明包的導入路徑字符串的具體含義导入路径的具體含義是由構建工具來解釋的。在本章我們將深入討論Go语言工具箱的功能包括大家經常使用的構建測試等功能。當然也有第三方擴展的工具箱存在。例如Google公司內部的Go语言碼農他们就使用內部的多語言構建繫統译注Google公司使用的是类似[Bazel](http://bazel.io)的构建系统支持多种编程语言目前该构件系统还不能完整支持Windows环境用不同的規則來處理包名字和定位包用不同的規則來处理單元測試等等因为這樣可以更緊密適配他們內部环境。 就像我們在2.6.1節提到過的Go語言的規范併沒有指明包的導入路徑字符串的具體含義導入路徑的具體含義是由構建工具來解釋的。在本章我們將深入討論Go語言工具箱的功能包括大家經常使用的構建測試等功能。當然也有第三方擴展的工具箱存在。例如Google公司內部的Go語言碼農他們就使用內部的多語言構建繫統譯註Google公司使用的是類似[Bazel](http://bazel.io)的構建繫統支持多種編程語言目前該構件繫統還不能完整支持Windows環境用不同的規則來處理包名字和定位包用不同的規則來處理單元測試等等因爲這樣可以更緊密適配他們內部環境。
如果你計劃分享或發布包那麽導入路徑最好是全球唯一的。爲了避免衝突所有非標準庫包的導入路徑建議以所在組織的互聯網域名爲前綴而且這樣也有利於包的檢索。例如上面的import句導入了Go糰隊維護的HTML解析器和一個流行的第三方維護的MySQL驅動。 如果你計劃分享或發布包那麽導入路徑最好是全球唯一的。爲了避免衝突所有非標準庫包的導入路徑建議以所在組織的互聯網域名爲前綴而且這樣也有利於包的檢索。例如上面的import句導入了Go糰隊維護的HTML解析器和一個流行的第三方維護的MySQL驅動。

View File

@ -1,8 +1,8 @@
## 10.3. 包聲明 ## 10.3. 包聲明
在每個Go源文件的開頭都必鬚有包聲明. 主要的目的是確定當前包被其他包導入時默認的標識符(稱爲包名). 在每個Go語音源文件的開頭都必鬚有包聲明語句。包聲明語句的主要目的是確定當前包被其它包導入時默認的標識符(也稱爲包名)。
例如, math/rand 包的每個文件的開頭都是 `package rand` 包聲明, 所有 當你導入這個包, 你可以用 rand.Int, rand.Float64 的方式訪問包的成員. 例如math/rand包的每個源文件的開頭都包含`package rand`包聲明語句所以當你導入這個包你就可以用rand.Int、rand.Float64類似的方式訪問包的成員。
```Go ```Go
package main package main
@ -17,11 +17,10 @@ func main() {
} }
``` ```
通常來説, 默認的包名就是包導入路徑名的最後一段, 因此卽使兩個包的導入路徑不同, 它們依然可能有一個相同的包名. 例如, math/rand 和 crypto/rand 包的名字都是 rand. 稍後我們將看到如何同時導入兩個包名字相同的包. 通常來説默認的包名就是包導入路徑名的最後一段因此卽使兩個包的導入路徑不同它們依然可能有一個相同的包名。例如math/rand包和crypto/rand包的包名都是rand。稍後我們將看到如何同時導入兩個有相同包名的包。
關於默認包名一般采用導入路徑名的最後一段的約定有三種例外情況. 第一個例外是包對應一個可執行程序, 也就是 main 包, 這時候main包本身的導入路徑是無關緊要的. 這是給 go build (§10.7.3) 構建命令一個信息, 必鬚調用連接器生成一個可執行程序. 關於默認包名一般采用導入路徑名的最後一段的約定也有三種例外情況。第一個例外包對應一個可執行程序也就是main包這時候main包本身的導入路徑是無關緊要的。名字爲main的包是給go build§10.7.3)構建命令一個信息,這個包編譯完之後必鬚調用連接器生成一個可執行程序。
第二個例外是包所在的目録中可能有一些文件名是以_test.go爲後綴的Go源文件(譯註: 前面必鬚有其他的字符, 因爲 _ 前綴的源文件可能是被忽略的.), 併且這些源文件聲明的包名也是以_test爲後綴名的. 這種目録可以定義兩個包: 一個普通包, 加一個外部測試包. 以 _test 爲後綴包名的外部測試包由 go test 命令獨立編譯, 兩個包是相互獨立的. 外部測試包一般用來避免測試代碼中的導入包的循環導入依賴, 具體細節我們將在 11.2.4 中介紹. 第二個例外包所在的目録中可能有一些文件名是以_test.go爲後綴的Go源文件譯註前面必鬚有其它的字符因爲以`_`前綴的源文件是被忽略的併且這些源文件聲明的包名也是以_test爲後綴名的。這種目録可以包含兩種包一種普通包加一種則是測試的外部擴展包。所有以_test爲後綴包名的測試外部擴展包都由go test命令獨立編譯普通包和測試的外部擴展包是相互獨立的。測試的外部擴展包一般用來避免測試代碼中的循環導入依賴具體細節我們將在11.2.4節中介紹。
第三個例外是一些依賴版本號的管理工具會在導入路徑後追加版本號信息, 例如 "gopkg.in/yaml.v2". 這種情況下包的名字併不包含版本號後綴, 隻是yaml.
第三個例外,一些依賴版本號的管理工具會在導入路徑後追加版本號信息,例如"gopkg.in/yaml.v2"。這種情況下包的名字併不包含版本號後綴而是yaml。