go中结构体字段首字母大写才可导出并被外部包访问,小写字段包外不可见;json序列化、orm映射及跨包操作均依赖此规则,且方法接收者类型(值或指针)决定能否修改原结构体。

Go 没有类,但结构体 struct 就是你的“类”——它不带行为,只管组织数据;行为靠方法绑定,而方法是否能改原值,全看接收者用的是值还是指针。
struct 字段首字母大小写决定能否导出
字段名首字母小写(如 name、age)表示包内私有,外部包无法访问;首字母大写(如 Name、Age)才可被其他包读写。这不是风格问题,是 Go 的导出规则硬约束。
- JSON 序列化时,小写字母字段默认被忽略(
json:"-"或json:"name"也救不了它) - 数据库 ORM(如 GORM)通常只扫描大写字段映射列,小写字段不会自动建表或填充
- 接口实现不关心字段可见性,但若方法里要读写私有字段,只能在定义它的包内操作
值接收者 vs 指针接收者:改不改得动原结构体
方法声明里的接收者类型直接决定你能不能修改结构体内容。值接收者传的是副本,改了白改;指针接收者才真正连着原内存。
- 想让方法修改字段(比如
SetAge()、Start()),必须用指针接收者:func (u *User) SetAge(a int) { u.Age = a } - 只读操作(如
GetName()、String())可用值接收者,避免不必要的指针开销 - 同一个类型混用两种接收者会报错:如果已有指针接收者方法,再为该类型定义值接收者方法,调用时可能因方法集不一致导致接口实现失败
结构体字面量初始化时的逗号不能省(尤其最后一行)
用 {...} 初始化结构体时,若字段跨多行,末尾字段后必须加逗号——Go 要求,不是建议。
- 正确:
user := User{ Name: "Alice", Age: 30, } - 错误(编译失败):
user := User{ Name: "Alice", Age: 30 }—— 第二个}前少逗号,Go 解析器会报syntax error: unexpected newline, expecting comma or } - 单行可省逗号,但多人协作项目建议统一加,避免增删字段时反复补/删逗号
最容易被忽略的是:结构体本身是值类型,赋值或传参默认拷贝全部字段;哪怕它包含一个 map 或 slice,这些引用类型字段指向的底层数据仍共享——但结构体头(比如长度、指针地址)是独立的。这点在并发读写或深拷贝时,必须手动处理。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











