1.要使某個符號對其他包( package)可見(即可以訪問),需要將該符號定義為以大寫字母開頭------摘自go相關書籍
2.go只限制包內外的可訪問性,而不限制同包內不同文件的可訪問性
本文討論結構體三個部分的可訪問性:結構體本身、結構體變量、結構體變量的成員變量
在討論某一部分時,保證其它部分包外可訪問。
1. 結構體本身 的可訪問性
test1.go:
package tt type Test struct { X int }
main.go:
package main import ( "fmt" "tt" ) var a = &tt.Test{X: 5} func main() { fmt.Println(a) } //編譯成功,輸出: // &{5}
若將test1.go中的結構體"Test"改為"test",則編譯錯誤,提示"test"不可訪問。
注:修改"Test"時同時修改main.go相關代碼,后續測試中默認進行修改,不再強調。
結論:結構體名的大小寫影響結構體本身的可訪問性,首字母小寫則包外不可見(如定義結構體"test",則不能在包外定義該"test"類型的結構體變量)
2.結構體變量
test1.go
package tt type Test struct { X int } var t Test
main.go
package main import ( "fmt" "tt" ) func main() { fmt.Println(tt.t) }
編譯錯誤,提示tt.t不可訪問;將結構體變量"t"改為"T"后,程序正常運行,輸出 {0}
結論:同上,結構體變量名的首字母大小寫 將影響其在包外的可訪問性。
3.結構體變量的成員變量
1)不同包
test1.go
package tt type test struct { x int } var T test
main.go
package main import ( "fmt" "tt" ) func main() { fmt.Println(tt.T.x) }
編譯錯誤,提示tt.T.x不可訪問;將T成員變量"x"改為"X"后,程序正常運行,輸出 0
結論:同上。
2)同包
package main import ( "fmt" ) type test struct { x int } func main() { t := new(test) fmt.Println(t.x) }
程序正常運行,輸出 0。
結論:同包內,結構體變量的成員變量可隨時被訪問,不受首字母大小寫的影響(即便成員變量小寫,也可被直接訪問,而不需要通過成員函數來實現)。