Как объединить 2 структурных содержимого, одно из которых имеет одинаковые ключи - PullRequest
0 голосов
/ 16 мая 2019

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

type moreStruct struct {
    A string `json:"a"`
    B string `json:"b"`
    C string `json:"c"`
    D string `json:"d"`
    E string `json:"e"`
}

type leseStruct struct {
    A string `json:"a"`
    B string `json:"b"`
    D string `json:"d"`
}

more := moreStruct{
        A: "aaa",
        B: "bbb",
        C: "ccc",
        D: "ddd",
        E: "eee",
}
less := leseStruct{
        A: "aaaaaaa",
        B: "bbbbbbb",
        D: "ddddddd",
}

//hava any better mothod than below in one line
more.A = less.A
more.B = less.B
more.D = less.D

1 Ответ

1 голос
/ 16 мая 2019

Правильно, поэтому, если вы можете изменить сами типы / структуры, вы можете использовать встраивание, чтобы вы могли переназначить все подмножество полей.Это означает, что вам придется немного изменить способ написания литералов, и, поскольку вы используете json, нужно будет экспортировать встроенный тип.

// Less, the smallest subset of fields that are shared
type Less struct {
    A string `json:"a"`
    B string `json:"b"`
    D string `json:"d"`
}

// More the type that has all the fields in Less + some of its own
type More struct {
    Less // embed Less in this type
    C string `json:"c"`
    E string `json:"e"`
}

Теперь, когда мы получилиэти типы, вот как вы инициализируете поля в литерале:

more := More{
    Less: Less{
        A: "aaa",
        B: "bbb",
        D: "ddd",
    },
    C: "ccc",
    E: "eee",
}
// or the dirty way (no field names) - don't do this... it's nasty
yuck := More{
    Less{
        "a",
        "b",
        "d",
    },
    "c",
    "e",
}

Теперь, скажем, у нас есть переменная less примерно так:

less := Less{
    A: "aaaaa",
    B: "bbbbb",
    D: "ddddd",
}

И теперь мыхотим скопировать эти значения в переменную more, которую мы создали выше:

more.Less = less

Работа выполнена ... Поскольку тип Less встроен, json marshalling и unmarshalling все равно будут работать вТочно так же

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...