Golang新手问题:如何将一个Struct嵌入另一个实现字段扁平化
Go结构体嵌入实现字段扁平化方法
你写的写法本身就是Go原生支持的结构体扁平化方案:匿名嵌入结构体。
Go没有类似JS对象扩展运算符的显式合并语法,但匿名嵌入(也叫匿名字段)天生就能实现你要的效果:
- 访问字段时可以直接写
ComplexInfo实例.name、ComplexInfo实例.age,不需要额外加一层SimpleInfo前缀 - JSON、XML等序列化操作默认会把嵌入结构体的字段提到外层,和外层结构体自定义字段平级,完全符合你期望的结构。
注意事项
- 如果需要字段对外(包括序列化库、其他包)可见,必须把结构体字段首字母改为大写,Go中小写开头的字段属于包私有属性,外部无法访问。
- 如果嵌入结构体和外层结构体存在同名字段,默认优先取外层字段的值;要访问嵌入结构体的同名字段需要显式加嵌入结构体名前缀:
实例.SimpleInfo.同名字段。
可运行示例代码
package main import ( "encoding/json" "fmt" ) type SimpleInfo struct { Name string Age int } type ComplexInfo struct { SimpleInfo // 匿名嵌入SimpleInfo结构体 Address string Salary int } func main() { info := ComplexInfo{ SimpleInfo: SimpleInfo{Name: "张三", Age: 25}, Address: "北京市朝阳区", Salary: 15000, } // 直接访问嵌入结构体的字段 fmt.Println(info.Name, info.Age) // 输出:张三 25 // JSON序列化默认输出扁平化结构 jsonBytes, _ := json.MarshalIndent(info, "", " ") fmt.Println(string(jsonBytes)) }
运行输出的JSON结果
{ "Name": "张三", "Age": 25, "Address": "北京市朝阳区", "Salary": 15000 }
内容的提问来源于stack exchange,提问作者Qarun Qadir Bissoondial
相关产品推荐
相关产品推荐

