Как объединить 2 структуры - PullRequest
4 голосов
/ 15 марта 2019

Я пытаюсь изменить некоторые вещи в Go. У меня есть следующая структура, которую я создал

У меня есть вызов API, возвращающий что-то вроде этого

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

в одном вызове кода, я хочу добавить новый ключ к этой структуре

как

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"`
}

Дело в том, что я хочу добавить новый ключ и оставить остальное в корне объекта, как объект выше. без необходимости переписывать полную структуру объекта или выполнять цикл for для каждого ключа.

type MyNewStruct struct {
    *MyStruct
    MyNewKey MyValueType
}

У меня есть две переменные с данными,

MyStructData и MyNewKeyData

Я хочу, но не знаю, как объединить эти две данные внутри MyNewStruct, чтобы все в MyStructData было в корне ключа, а все в MyNewKeyData было бы ключом MyNewKey

Я пытаюсь что-то вроде

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

но не работает

Ответы [ 2 ]

4 голосов
/ 15 марта 2019

Когда вы создаете анонимный член в структуре, компилятор генерирует имя для члена, имя которого совпадает с типом. Вы можете использовать это имя при инициализации содержащей структуры.

Вот упрощенный пример

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",
}
1 голос
/ 15 марта 2019

Я не уверен, что полностью понимаю, что вы ищете, но это может помочь.

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...