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

张开发
2026/5/17 9:32:59 15 分钟阅读
Go语言结构体如何定义_Go语言struct结构体教程【深入】
Go结构体字段首字母大写才可导出并被其他包访问JSON序列化和ORM仅处理大写字段方法接收者需根据是否修改原值选择指针或值类型初始化推荐显式命名字段嵌入结构体是字段提升而非继承含不可比较类型时结构体不可用比较。结构体字段名首字母大小写决定能不能被其他包访问Go 没有 public/private 关键字字段是否可导出即能被其他包使用只看名字首字母大写如 Name、ID可导出小写如 name、id仅限本包内访问。JSON 序列化时小写字段会被忽略——json.Marshal 不会输出 age但会输出 AgeORM如 GORM映射数据库时默认也只认大写字段CreatedAt 能自动填充createdAt 就是静默丢数据方法接收者如果用值类型func (p Person) Print()修改内部小写字段不会影响原值但指针接收者func (p *Person) SetAge()可以改前提是该字段本身可寻址即它得是大写字段否则连编译都过不去初始化结构体必须明确字段顺序或显式命名Go 支持两种初始化方式但混用会直接报错。不写字段名就按定义顺序填值少一个或多一个都编译失败。推荐始终用字段名初始化p : Person{Name: Alice, Age: 30}加新字段不影响旧代码纯值列表p : Person{Alice, 30}只适合字段极少、且长期稳定的场景比如二维点 Point{X: 1, Y: 2} 或 Point{1, 2}如果结构体含嵌套结构体如 Address 字段嵌套部分也必须完整初始化Address: Address{City: Beijing}不能只写 Address: {Beijing}嵌入结构体不是继承而是字段提升 方法组合写 type Student struct { Person; Class string }看起来像“继承”实际只是把 Person 的字段和方法“提上来”一层没有父子类关系也没有虚函数表。Student 可以直接访问 s.Name是因为编译器自动做了字段提升不是语法糖是真实内存布局展开如果两个嵌入结构体有同名方法比如都定义了 Speak()调用 s.Speak() 会编译报错“ambiguous selector”必须显式写成 s.Person.Speak() 或 s.Animal.Speak()嵌入的结构体字段若为小写如 person则无法被外部包访问更不会被提升——只有导出的嵌入类型才有效结构体方法接收者选值还是指针取决于是否要修改原值这不是风格问题是语义和性能问题。值接收者复制整个结构体指针接收者只传地址。 Evoker 一站式AI创作平台

更多文章