標籤:go golang 變數匯出 函數匯出 大寫
Go編程——變數、函數匯出與首字母大寫
標識符可被 匯出 以允許從另一個包訪問。
同時符合以下條件即為已匯出標識
1、標識符名的第一個字元為Unicode大寫字母(Unicode類別“Lu”);
2、該標識符在包塊中已聲明或為欄位名或方法名。
以程式匯入gotest/even包為例
package mainimport ( "even" "fmt")func main() { i:=even.I fmt.Printf("Is %d even? %v\n", i, even.Even(i))}
package evenvar I int = 123 func Even(i int) bool { return i%2==0}func odd(i int) bool { return i%2!=0}
1.當地套件 even 在這裡匯入;2. 官方 fmt 包匯入;3.調用 even 包中的函數。
訪問一個包中的函數的文法是 <package>.Function
(),
變數
<package>.Var。在 Go 中,當
變數或函數的首字母大寫的時候,
函數會被從包中匯出(在包外部可見,
或者說公有的),因此函數名是 Even。如果修改main.go 的第 10 行,使用未導出的函數 even.odd:
fmt.Printf("Is %d even? %v\n", i, even.odd(i))
由於使用了私人的函數,會得到一個編譯錯誤:
main.go:10: cannot refer to unexported name even.odd
概括來說: 公有函數的名字以大寫字母開頭;私人函數的名字以小寫字母開頭。
對於結構體
type S struct { T1 //欄位名字是 T1 *T2 //欄位名字是 T2 P.T3 //欄位名字是 T3 x, y int //欄位名字是 x 和 y}
同樣,首字母大寫的欄位可以被匯出,也就是說,在其他包中可以進行讀寫。字段名以小寫字母開頭是當前包的私人的,函數定義也是類似的。對於T1, *T2等匿名欄位,其作用是“如果結構體 S,包含一個匿名欄位 T1,那麼這個結構體 S 就有了 T1的方法。如果包含的匿名欄位為 *T2,那麼這個結構體 S 就有了 *T2 的方法。”具體見另一篇文章http://blog.csdn.net/typ2004/article/details/41605083(golang 匿名欄位)。
Go編程——變數、函數匯出與首字母大寫