這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。包由單個目錄內的源檔案組成。 在這樣的目錄中,從不同的包中擷取檔案是非法的。 在 Go 中開始每個源檔案的 Package 語句定義了檔案所屬的包:```gopackage foo```> package 語句不是引入新標識符的聲明,因此以後在源檔案中不能使用 "foo"。包的名稱具有類似於常規標識符的文法。 所有共用相同包名的檔案形成包。為了使用來自其他包裹的標識符,需要 import 聲明:```goimport "fmt"```在 `import` 關鍵字後指定的字串稱為匯入路徑。 它需要唯一標識一個包。 標準庫中的軟體包使用較短的匯入路徑,但一般的包,比如 `github.com/mlowicki/foo` 看起來會更長。在上面的形式中,通過 package 聲明中的包名來完成對匯出的標識符的訪問。 因此,除了識別屬於包的檔案外,它還將作為匯入聲明的預設包名。 通過匯入路徑之前的標識符可以覆蓋它:```goimport (f "fmt")func main() {f.Println("whatever")}```> 如 [Go 中的範圍](https://medium.com/@mlowicki/scopes-in-go-a6042bb4298c)中所述,軟體包名稱的範圍是檔案塊。匯入後並不是所有包的標識符都可以訪問。 只有匯出的標識符才可以訪問,匯出標識符必須遵守的兩個規則才能從其他包中直接存取:* 標識符的第一個字元是大寫字母* 要麼在包塊中定義標識符,要麼是欄位名稱或 `method` 方法名稱## 包塊的標識符被定義在軟體包塊中意味著它被定義在任何功能之外,如:```gopackage libraryvar V = 1type S struct {Name string}type I interface {M()}```V,S 和 I 可用於具有適當匯入語句的檔案中:```gopackage mainimport ("fmt""github.com/mlowicki/library")func main() {s := library.S{}fmt.Println(library.V, s)}```## 匯出的欄位名稱欄位名稱還必須以大寫字母開頭,以便從其他包中訪問:```gopackage librarytype record struct {Name stringage int8}func GetRecord() record {return record{Name: "Michał", age: 29}}package mainimport ("fmt""github.com/mlowicki/library")func main() {record := library.GetRecord()fmt.Println(record.Name)}```上面的代碼可以正常工作,但嘗試訪問未匯出的欄位 `age`...```gofmt.Println(me.age)```編譯時間失敗:```record.age undefined (cannot refer to unexported field or method age)```在庫包中匯出結構體,比如改為 Record,但這不會改變任何內容 - 即結構類型仍然不會匯出 age 欄位。## 匯出的 `method` 名稱與欄位名稱相同的規則適用於 `method`:```gopackage libraryimport "fmt"type Duck interface {Quack()walk()}type Record struct{}func (Record) Quack() {fmt.Println("Quack")}func (Record) walk() {fmt.Println("walk")}func GetDuck() Duck {return Record{}}package mainimport ("github.com/mlowicki/library")func main() {duck := library.GetDuck()duck.Quack()record := library.Record{}record.Quack()}```輸出:```bash> ./bin/sandboxQuackQuack```調用方法 `walk` 是非法的:```goduck.walk()```輸出:```bashduck.walk undefined (cannot refer to unexported field or method walk)```或者:```gorecord.walk()```在編譯時間會報如下錯誤:```bashrecord.walk undefined (cannot refer to unexported field or method library.Record."".walk)```
via: https://medium.com/golangspec/exported-identifiers-in-go-518e93cc98af
作者:Michał Łowicki 譯者:wentingrohwer 校對:polaris1119
本文由 GCTT 原創編譯,Go語言中文網 榮譽推出
本文由 GCTT 原創翻譯,Go語言中文網 首發。也想加入譯者行列,為開源做一些自己的貢獻嗎?歡迎加入 GCTT!
翻譯工作和譯文發表僅用於學習和交流目的,翻譯工作遵照 CC-BY-NC-SA 協議規定,如果我們的工作有侵犯到您的權益,請及時聯絡我們。
歡迎遵照 CC-BY-NC-SA 協議規定 轉載,敬請在本文中標註並保留原文/譯文連結和作者/譯者等資訊。
文章僅代表作者的知識和看法,如有不同觀點,請樓下排隊吐槽
306 次點擊