Go语言结构体如何定义_Go语言struct结构体教程【实战】

张开发
2026/4/16 1:40:21 15 分钟阅读

分享文章

Go语言结构体如何定义_Go语言struct结构体教程【实战】
Go结构体字段首字母大写才可导出并被外部访问小写字段包内私有、JSON序列化和ORM映射时被忽略嵌入结构体需导出类型才支持字段提升初始化推荐键值对避免错位方法接收者依是否修改原值选指针或值类型。结构体字段名必须大写才能被外部访问Go 没有 public/private 关键字字段是否可导出即能被其他包访问只看首字母大写Name、ID是导出字段小写name、id是包内私有。这点不注意跨包调用时会直接报 cannot refer to unexported field。JSON 序列化时小写字段自动被忽略json.Marshal 不会包含它们ORM如 GORM映射数据库时同样跳过小写字段容易导致数据漏存嵌入结构体时如果嵌入的是小写结构体如 person它不会提升字段s.Name 会编译失败初始化结构体优先用字段名赋值别依赖顺序用值列表初始化Student{101, lisi, 20, 97}看似简洁但一旦结构体字段增删或顺序调整所有这类初始化都会 silently 错位——比如把 Age 写进 Score 位置编译不报错运行时才出逻辑 bug。推荐始终使用键值对初始化Student{ID: 101, Name: lisi, Age: 20, Score: 97}字段可以乱序也可以省略省略字段取零值、0、nil加了新字段后旧初始化代码仍能编译通过不会意外覆盖其他字段方法接收者选值类型还是指针类型看要不要改原值定义方法时接收者写 func (s Student) Modify() 还是 func (s *Student) Modify()不是风格问题而是语义和行为差异。值接收者方法内对 s 的任何修改如 s.Age 25都不会影响调用方的原始结构体实例指针接收者能真正修改原值也更省内存避免拷贝整个结构体只要结构体中任一方法用了指针接收者建议全部统一用指针——否则调用方混用 s.Method() 和 s.Method() 容易混乱结构体含 slice/map/chan 等引用字段时即使只读也建议用指针接收者避免误以为值拷贝是深拷贝嵌入结构体不是继承是字段提升 方法组合写 type Employee struct { Person; Title string }看起来像“继承”但 Go 里没有继承概念。它只是把 Person 的导出字段和方法“提上来”让 e.Name 和 e.SayHello() 可以直接调用。 Mokker AI AI产品图添加背景

更多文章