Go语言如何定义一次结构体后复用字段减少其他结构体的冗余
Go 重复结构体字段优化方案
Go 语言原生支持结构体匿名嵌入特性,可以完美解决这类公共字段复用需求,只需将重复字段抽取为独立的公共基础结构体,其他业务结构体直接嵌入该基础结构体即可,原有字段的序列化标签也会完全正常生效。
实现代码
方案1:支持后续单独扩展字段(推荐)
如果后续不同结构体需要新增各自独有的字段,优先用嵌入方式,和原有使用逻辑完全兼容:
// 抽取所有公共字段作为基础结构体 type CommonResourceFlag struct { Data bool `yaml:"data,omitempty" json:"data,omitempty"` Self bool `yaml:"self,omitempty" json:"self,omitempty"` Blob bool `yaml:"blob,omitempty" json:"blob,omitempty"` } // 业务结构体直接嵌入公共结构体,无需重复定义字段 type FormAction struct { CommonResourceFlag // 后续可在此处单独追加 FormAction 独有的字段,不影响其他结构体 } type ManifestSrc struct { CommonResourceFlag // 后续可在此处单独追加 ManifestSrc 独有的字段 } type PrefetchSrc struct { CommonResourceFlag // 后续可在此处单独追加 PrefetchSrc 独有的字段 }
使用方式和原有代码完全一致,可直接访问嵌入的字段:var form FormAction; form.Data = true,YAML、JSON 序列化/反序列化效果和原有代码无任何差异。
方案2:无需扩展字段的精简写法
如果三个结构体后续完全不需要新增自定义字段,也可以直接用类型定义简化:
type CommonResourceFlag struct { Data bool `yaml:"data,omitempty" json:"data,omitempty"` Self bool `yaml:"self,omitempty" json:"self,omitempty"` Blob bool `yaml:"blob,omitempty" json:"blob,omitempty"` } type FormAction CommonResourceFlag type ManifestSrc CommonResourceFlag type PrefetchSrc CommonResourceFlag
该方案下三个类型属于独立的自定义类型,不可直接互相赋值,适合完全不需要定制的场景。
内容的提问来源于stack exchange,提问作者Yash Katta
相关产品推荐
相关产品推荐

