本篇基于 Go 1.25.1 版本,一次性讲透 Go 语言公有/私有核心规则,大小写控制访问权限,新手秒懂✅
一、Go 可见性终极规则(只有 1 条!)
Go 语言没有 public/private 关键字,完全靠大小写控制可见性:
✅ 大写开头 = 公开(公有)
包外可以访问
✅ 小写开头 = 私有
只有本包内部可以访问
就是这么简单!
二、可见性规则对照表(收藏)
| 命名方式 | 权限 | 包外可访问? | 示例 |
|---|---|---|---|
| 大写开头 | 公开(Exported) | ✅ 可以 | User GetName() Age |
| 小写开头 | 私有(Unexported) | ❌ 不可以 | user getName() age |
三、哪些东西受可见性控制?
全都是统一规则👇
- • 变量、常量
- • 函数、方法
- • 结构体、字段
- • 接口、方法
四、超清晰实战 Demo(多包结构)
项目结构
demo/
├── go.mod
├── main.go # 主包(main)
└── user/
└── user.go # user 包1. user/user.go(定义公开+私有)
// user 包:演示可见性规则
package user
import "fmt"
// ========== 大写开头:公开(包外可访问) ==========
// User 公开结构体
type User struct {
Username string // 公开字段
password string // 私有字段(包外无法访问)
}
// GetUserInfo 公开函数
func GetUserInfo() User {
return User{
Username: "Go学习者",
password: "123456",
}
}
// ========== 小写开头:私有(仅包内可用) ==========
// printSecret 私有函数
func printSecret() {
fmt.Println("私有方法,仅内部可调用")
}2. main.go(主包调用测试)
package main
import (
// 导入 user 包
"demo/user"
"fmt"
)
func main() {
fmt.Println("=== 1. 调用公开函数 ===")
u := user.GetUserInfo()
fmt.Println("用户名:", u.Username)
// 报错!password 小写=私有,无法访问
// fmt.Println(u.password)
fmt.Println("\n=== 2. 调用公开结构体 ===")
newUser := user.User{
Username: "新用户",
// password: "xxx", // 报错!
}
fmt.Println("新用户:", newUser)
// 报错!printSecret 小写=私有
// user.printSecret()
}五、运行命令 & 结果
# 初始化模块
go mod init demo
# 运行
go run main.go输出:
=== 1. 调用公开函数 ===
用户名: Go学习者
=== 2. 调用公开结构体 ===
新用户:{新用户 }六、高频重点总结
1. 结构体字段规则
- • 大写字段:外部可读写
- • 小写字段:外部不可读写(私有)
2. 包外只能“看到”大写成员
- • 小写函数、变量、结构体 → 包外看不见、调用报错
3. 设计原则
- • 对外提供功能:大写
- • 内部工具逻辑:小写
七、新手最常见错误
// 错误!调用小写私有成员
user.printSecret()
u.password
// 错误!导入的包访问不到小写成员📌 总结
- 1. 大写开头 = 公开:包外可访问
- 2. 小写开头 = 私有:仅本包可用
- 3. Go 无 public/private,大小写就是权限
- 4. 结构体字段、函数、变量规则完全一致
一篇搞定 Go 可见性规则,写包、封装、模块化再也不懵✨
MiaoAll