Fixes #198
This commit is contained in:
chai2010
2016-01-18 11:22:04 +08:00
parent 884ada9cd0
commit 9666211cd7
71 changed files with 107 additions and 105 deletions

View File

@@ -6,4 +6,4 @@
每個包還通過控製包內名字的可見性和是否導出來實現封裝特性。通過限製包成員的可見性併隱藏包API的具體實現將允許包的維護者在不影響外部包用戶的前提下調整包的內部實現。通過限製包內變量的可見性還可以強製用戶通過某些特定函數來訪問和更新內部變量這樣可以保證內部變量的一致性和併發時的互斥約束。
當我們脩改了一個源文件,我們必重新編譯該源文件對應的包和所有依賴該包的其他包。卽使是從頭構建Go語言編譯器的編譯速度也明顯快於其它編譯語言。Go語言的閃電般的編譯速度主要得益於三個語言特性。第一點所有導入的包必在每個文件的開頭顯式聲明,這樣的話編譯器就沒有必要讀取和分析整個源文件來判斷包的依賴關繫。第二點,禁止包的環狀依賴,因爲沒有循環依賴,包的依賴關繫形成一個有向無環圖,每個包可以被獨立編譯,而且很可能是被併發編譯。第三點,編譯後包的目標文件不僅僅記録包本身的導出信息,目標文件同時還記録了包的依賴關繫。因此,在編譯一個包的時候,編譯器隻需要讀取每個直接導入包的目標文件,而不需要遍歷所有依賴的的文件(譯註:很多都是重複的間接依賴)。
當我們脩改了一個源文件,我們必重新編譯該源文件對應的包和所有依賴該包的其他包。卽使是從頭構建Go語言編譯器的編譯速度也明顯快於其它編譯語言。Go語言的閃電般的編譯速度主要得益於三個語言特性。第一點所有導入的包必在每個文件的開頭顯式聲明,這樣的話編譯器就沒有必要讀取和分析整個源文件來判斷包的依賴關繫。第二點,禁止包的環狀依賴,因爲沒有循環依賴,包的依賴關繫形成一個有向無環圖,每個包可以被獨立編譯,而且很可能是被併發編譯。第三點,編譯後包的目標文件不僅僅記録包本身的導出信息,目標文件同時還記録了包的依賴關繫。因此,在編譯一個包的時候,編譯器隻需要讀取每個直接導入包的目標文件,而不需要遍歷所有依賴的的文件(譯註:很多都是重複的間接依賴)。

View File

@@ -1,6 +1,6 @@
## 10.3. 包聲明
在每個Go語音源文件的開頭都必有包聲明語句。包聲明語句的主要目的是確定當前包被其它包導入時默認的標識符(也稱爲包名)。
在每個Go語音源文件的開頭都必有包聲明語句。包聲明語句的主要目的是確定當前包被其它包導入時默認的標識符(也稱爲包名)。
例如math/rand包的每個源文件的開頭都包含`package rand`包聲明語句所以當你導入這個包你就可以用rand.Int、rand.Float64類似的方式訪問包的成員。
@@ -19,8 +19,8 @@ func main() {
通常來説默認的包名就是包導入路徑名的最後一段因此卽使兩個包的導入路徑不同它們依然可能有一個相同的包名。例如math/rand包和crypto/rand包的包名都是rand。稍後我們將看到如何同時導入兩個有相同包名的包。
關於默認包名一般采用導入路徑名的最後一段的約定也有三種例外情況。第一個例外包對應一個可執行程序也就是main包這時候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。

View File

@@ -25,7 +25,7 @@ import (
)
```
如果我們想同時導入兩個有着名字相同的包例如math/rand包和crypto/rand包那麽導入聲明必至少爲一個同名包指定一個新的包名以避免衝突。這叫做導入包的重命名。
如果我們想同時導入兩個有着名字相同的包例如math/rand包和crypto/rand包那麽導入聲明必至少爲一個同名包指定一個新的包名以避免衝突。這叫做導入包的重命名。
```Go
import (

View File

@@ -4,7 +4,7 @@
因爲每個目録隻包含一個包因此每個對應可執行程序或者叫Unix術語中的命令的包會要求放到一個獨立的目録中。這些目録有時候會放在名叫cmd目録的子目録下面例如用於提供Go文檔服務的golang.org/x/tools/cmd/godoc命令就是放在cmd子目録§10.7.4)。
每個包可以由它們的導入路徑指定,就像前面看到的那樣,或者用一個相對目録的路徑知指定,相對路徑必`.``..`開頭。如果沒有指定參數,那麽默認指定爲當前目録對應的包。 下面的命令用於構建同一個包, 雖然它們的寫法各不相同:
每個包可以由它們的導入路徑指定,就像前面看到的那樣,或者用一個相對目録的路徑知指定,相對路徑必`.``..`開頭。如果沒有指定參數,那麽默認指定爲當前目録對應的包。 下面的命令用於構建同一個包, 雖然它們的寫法各不相同:
```
$ cd $GOPATH/src/gopl.io/ch1/helloworld