一、Go 可见性核心规则
Go 语言没有public/private/protected关键字 ,通过标识符首字母大小写控制可见性,这是 Go 独有的访问权限设计规则:
- 首字母大写 :公开可见 ,所有包都能访问(包括外部包、当前包)
- 首字母小写 :私有可见 ,仅当前包内能访问,外部包完全无法调用
二、高频使用场景的可见性要求
想要在 A 包中使用 B 包的成员 ,以下所有标识符首字母必须大写:
- 调用函数 → 函数名大写
- 定义 / 使用结构体类型 → 结构体名大写
- 访问结构体成员变量 / 方法 → 成员名、方法名大写
- 使用自定义类型 → 类型名大写
三、代码验证(最直观理解)
1. 外部包定义(test 包)
go
Go
// 文件名:test/test.go
package test
import "fmt"
// ---------------- 私有成员(首字母小写,仅test包内能访问) ----------------
// myFunc 私有函数:外部包无法调用
func myFunc() {
fmt.Println("this is myFunc(私有)")
}
// user 私有结构体:外部包无法定义、使用
type user struct {
name string // 私有成员:外部包无法访问
age int
}
// ---------------- 公开成员(首字母大写,所有包可访问) ----------------
// MyFunc 公开函数:外部包可直接调用
func MyFunc() {
fmt.Println("this is MyFunc(公开)")
}
// User 公开结构体:外部包可定义、使用
type User struct {
Name string // 公开成员:外部包可赋值/访问
Age int // 公开成员
}
2. 主包调用(main 包,跨包访问)
go
Go
// 文件名:main.go
package main
import (
"test" // 导入自定义test包
)
func main() {
// 成功:调用公开函数 MyFunc(首字母大写)
test.MyFunc()
// 报错:无法调用私有函数 myFunc(首字母小写)
// test.myFunc()
// 成功:定义公开结构体 User(首字母大写)
u := test.User{
Name: "张三", // 成功:访问公开成员 Name
Age: 18, // 成功:访问公开成员 Age
}
println(u.Name, u.Age)
// 报错:无法定义私有结构体 user
// u2 := test.user{}
// 报错:无法访问私有成员 name
// println(u.name)
}
四、核心总结
- 可见性是包级别的 :最小控制单元是包,不是类 / 对象
- 大小写定生死:大写 = 公开,小写 = 私有
- 全链路大写 :想用外部包的函数、结构体、成员,全部首字母大写
- 私有作用:封装内部逻辑,避免外部随意修改,保证代码安全性