如何合并两个结构体

4

我想修改Go语言中的一些内容,我创建了以下这个结构体:

我有一个API调用,返回类似于以下结果:

MyStruct struct {
    DID              string `bson:"d_id" json:"d_id"`
    PID              string `bson:"p_id" json:"p_id"`
    ...
}

在代码中的一个调用中,我想要将一个新的键(key)附加到那个结构体(struct)中。
例如:
myNewStruct {
        DID              string `bson:"d_id" json:"d_id"`
        PID              string `bson:"p_id" json:"p_id"`
        ...
        MyNewKey         string `bson:"new_key" json:"new_key"`
}

事实上,我想添加一个新的键,并将其余部分保留在对象的根目录下,就像上面的对象一样。而不必重写整个对象结构或对每个键进行循环处理。
type MyNewStruct struct {
    *MyStruct
    MyNewKey MyValueType
}

我有两个带有数据的变量:

MyStructDataMyNewKeyData

我想要合并这两个数据到 MyNewStruct 中,使得 MyStructData 中的所有内容都在根键(root key)下,而MyNewKeyData 中的所有内容都在 MyNewKey 键下。

我尝试了以下操作:

    theObjectIWant := MyNewStruct {
        MyStructData,
        "MyNewKey" : MyNewKeyData 
    }

但是无法正常工作。

Chris Taylor的回答看起来就是你要找的。我只想评论一下Golang的术语。你所说的“key”在Golang中被称为“field”,例如DIDPIDMyStruct的字段,不要与“map”中的“key”混淆。 - phanhuy152
2个回答

5

当你在一个结构体中创建一个匿名成员时,编译器会为该成员生成一个与类型相同的名称。在初始化包含结构体时,你可以使用这个名称。

以下是一个简化的示例

type MyStruct struct {
    DID string
    PID string
}

type MyNewStruct struct {
    MyStruct
    MyNewKey string
}

ms := MyStruct{
    DID: "did",
    PID: "pid",
}

m := MyNewStruct{
    MyStruct: ms,
    MyNewKey: "test",
}

但是在进行JSON编组/解组时要小心! - Bohdan Kostko

1

我不确定我完全理解你所寻找的内容,但这可能会有所帮助。

type MyStruct struct {
   DID string
   PID string
}

type myNewStruct struct {
   MyStruct
   newKey string
}

func main() {
   s1 := MyStruct{DID: `bson:"d_id" json:"d_id"`}
   s2 := myNewStruct{MyStruct: s1, newKey: `bson:"new_key" json:"new_key"`}
   fmt.Println(s2.DID)
   fmt.Println(s2.newKey)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接