《Go語言實戰》讀書筆記——公開或未公開的識別符號
阿新 • • 發佈:2021-01-14
一、包裡未公開的識別符號
Go語言支援從包裡公開或者隱藏識別符號。通過這個功能,讓使用者能按照自己的規則控制識別符號的可見性。
這個就類似於Java當中的許可權修飾符private、public,只是golang當中是使用對變數名首字母大小寫來控制其的可訪問性。
package counters
type alertCounter int
package main import ( "fmt" "counters" ) // main 是應用程式的入口 func main() { // 建立一個未公開的型別的變數 // 並將其初始化為 10 counter := counters.alertCounter(10) fmt.Printf("Counter: %d\n", counter) }
上述的程式碼會執行錯誤
只要將自定義型別的首字母改成大寫就可以正常初始化了
或者我們可以使用一個工廠函式對其進行初始化
package counters
type alertCounter int
func New(value int) alertCounter{
return alertCounter(value)
}
package main import ( "fmt" "counters" ) // main 是應用程式的入口 func main() { // 建立一個未公開的型別的變數 // 並將其初始化為 10 counter := counters.New(10) fmt.Printf("Counter: %d\n", counter) }
二、結構裡的不可見欄位
package entities
// User 在程式裡定義一個使用者型別
type User struct {
Name string
email string
}
package main
import (
"fmt"
"entities"
)
// main 是應用程式的入口
func main() {
// 建立 entities 包中的 User 型別的值
u := entities.User{
Name: "Bill",
email: "[email protected] ",
}
// ./example69.go:16: 結構字面量中結構 entities.User
// 的欄位’email’未知
fmt.Printf("User: %v\n", u)
}
上述例子只需要將email改成首字母大寫即可
三、公開和未公開的內嵌型別
package entities
// user 在程式裡定義一個使用者型別
type user struct {
Name string
Email string
}
// Admin 在程式裡定義了管理員
type Admin struct {
user // 嵌入的型別是未公開的
Rights int
}
package main
import (
"fmt"
"entities"
)
// main 是應用程式的入口
func main() {
// 建立 entities 包中的 Admin 型別的值
a := entities.Admin{
Rights: 10,
}
// 設定未公開的內部型別的
// 公開欄位的值
a.Name = "Bill"
a.Email = "[email protected]"
fmt.Printf("User: %v\n", a)
}
由於內部型別 user 是未公開的,這段程式碼無法直接通過結構字面量的方式初始化該內部型別。不過,即便內部型別是未公開的,內部型別裡宣告的欄位依舊是公開的。既然內部型別的識別符號提升到了外部型別,這些公開的欄位也可以通過外部型別的欄位的值來訪問。