
在 go 中,只有首字母大写的结构体及其字段才能被其他包访问;小写字段属于未导出成员,外部无法读写,这是 go 的可见性机制核心规则。
在 go 中,只有首字母大写的结构体及其字段才能被其他包访问;小写字段属于未导出成员,外部无法读写,这是 go 的可见性机制核心规则。
Go 语言通过标识符的首字母大小写严格控制作用域可见性:首字母大写的标识符(如 Credentials、Key)是“导出的”(exported),可在其他包中访问;首字母小写的标识符(如 key、responseType)是“未导出的”(unexported),仅限本包内使用。这一设计是 Go 包封装与 API 设计的基础原则。
因此,若希望用户在 main 程序中直接初始化并使用你包中定义的结构体,必须同时满足两个条件:
- 结构体类型名首字母大写(如 Credentials → 可被导入)
- 所有需外部访问的字段名首字母大写(如 Key、ResponseType → 支持字段赋值与读取)
✅ 正确示例(something 包):
// file: something/credentials.go
package something
type Credentials struct {
Key string // 导出字段:可读可写
ResponseType string // 导出字段
Subscription string // 导出字段
Locale string // 导出字段
}
type WwogcParams struct {
Name string // 导出字段
Value string // 导出字段
}
✅ 在 main 包中使用:
package main
import (
"fmt"
"something"
)
func main() {
// 直接构造包内导出结构体
param := something.WwogcParams{Name: "q", Value: "Delhi"}
wwogc := []something.WwogcParams{param}
cred := something.Credentials{
Key: "keykeykle",
ResponseType: "json",
Subscription: "premium",
Locale: "EN",
}
fmt.Printf("Credentials: %+v\n", cred) // 输出字段值
}
⚠️ 注意事项:
- 不要混用字段命名风格:key(小写)和 KeyType(大写)不可共存于同一结构体对外 API 中;
- 若需隐藏内部实现(如只允许通过方法设置字段),可将字段设为小写,并提供导出的构造函数或 setter 方法;
- 结构体本身未导出(如 type credentials struct {...})时,即使字段大写也无法被外部引用——类型名必须导出;
- Go 不支持类继承或 public/private 关键字,一切可见性均由首字母大小写决定,务必养成统一、清晰的命名习惯。
总结:Go 的导出规则简洁而严格。要让结构体“走出包外”,请牢记——大写即公开,小写即私有。从命名开始,就是你 API 设计的第一道门。











