You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:54:07