一、包里未公开的标识符
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: "bill@email.com",
}
// ./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 = "bill@email.com"
fmt.Printf("User: %v\n", a)
}
由于内部类型 user 是未公开的,这段代码无法直接通过结构字面量的方式初始化该内部类型。不过,即便内部类型是未公开的,内部类型里声明的字段依旧是公开的。既然内部类型的标识符提升到了外部类型,这些公开的字段也可以通过外部类型的字段的值来访问。