golang多个结构体合并成一个结构体,非嵌套,类似于array_merge,新结构体包含所有字段

新手上路,请多包涵

题目描述

golang结构体merge,成为一个结构体,且非嵌套结构体,如何实现

题目来源及自己的思路

相关代码

type studentSon struct {

SonName string `json:"sonName"`
SonAge  int    `json:"sonAge"`

}

type student struct {

Name string `json:"name"`
Age  int    `json:"age"`
studentSon

}

func main() {

var student = student{
    Name: "test",
}
fmt.Printf("%+v\n", student)

}

你期待的结果是什么?实际看到的错误信息又是什么?

期待结果:{Name:test Age:0 SonName: SonAge:0}}
实际结果:{Name:test Age:0 studentSon:{SonName: SonAge:0}}

阅读 8.5k
2 个回答

使用 json.Marshal(student) 你可以得到期待的结果
{Name:test Age:0 SonName: SonAge:0}}

使用 fmt.Printf("%+v\n", student) 你会得到
{Name:test Age:0 studentSon:{SonName: SonAge:0}}

使用 %+v 会输出结构体的真实结构(字段名,值)。
在调用方面,你可以视为一个包含所有字段的新结构来用,如 student.SonName,json 序列化也会帮你得到期待的结果。

目前来说做不到,go没有像java/cpp那样的继承机制,也不像 js/python 提供语法糖(prototype__mro__),go在这方面的技术选择是 组合替代继承

如果你确实不能接受组合的方式(或者因为某些原因不能用组合的方式),你可以考虑下自己用 go 的 ast/parse 包写一个代码生成器,参考 go 自己的 stringer,生成你想要的结构。

再补充一句,如果不是一定要用struct的话,可以考虑用 map[string]interface{} 来代替。如果是序列化里用到,可以看看这个stackoverflow的回答

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题