Как объединить 2 структуры

#go

#Вперед

Вопрос:

Я пытаюсь кое-что изменить в 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 
    }
  

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

Комментарии:

1. Ответ Криса Тейлора выглядит так, как вы ищете. Я просто хочу прокомментировать терминологию Golang. То, что вы подразумеваете под «ключом», в Golang называется «полем», например, DID amp; PID — это поля MyStruct . Не путать с «ключом» в «карте».

Ответ №1:

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

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

 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. Будьте осторожны с маршалингом / разархивированием json!

Ответ №2:

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

 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)
}