В Go есть ли способ конвертировать карту структуры в фрагмент структуры - PullRequest
0 голосов
/ 25 января 2020

Мне нужно преобразовать карту структуры в фрагмент структуры в Golang, то есть от источника к целевой структуре, указанной ниже.

// Source
var source map[string]Category

type Category struct {
    A           int
    SubCategory map[string]SubCategory
}

type SubCategory struct {
    B int
    C string
}

// Target
var target []OldCategory

type OldCategory struct {
    OldA           int `mapstructure:"A"`
    OldSubCategory []OldSubCategory
}

type OldSubCategory struct {
    OldB int    `mapstructure:"B"`
    OldC string `mapstructure:"C"`
}

Я имею в виду пакет mapstrucuture ("github.com/ mitchellh / mapstructure "). Один из способов преобразования из источника в цель - выполнить итерацию по всей подкатегории, а затем по категории в исходном экземпляре и использовать mapstructure.Decode () для преобразования каждого из них по отдельности.

Существует ли прямой способ использования пакета mapstrucuture, в котором Я создаю пользовательский хук декодера, используя NewDecoder и DecoderConfig.DecodeHook, и всякий раз, когда я сталкиваюсь с источником как картой структуры и целевым объектом как фрагмент структуры, я обрабатываю его в функции DecodeHookFun c.

Соответствующая документация структуры карты https://godoc.org/github.com/mitchellh/mapstructure#NewDecoder

Ответы [ 3 ]

1 голос
/ 27 января 2020

Вы можете сделать это, используя ловушки декодера mapstructure, написать собственную логику c внутри ловушки декодера, чтобы выполнить свою работу. Но нет стандартной функции lib, которая бы выполняла вашу работу.

Пример:

dc := &mapstructure.DecoderConfig{Result: target, DecodeHook: customHook}
    ms, err := mapstructure.NewDecoder(dc)
    if err != nil {
        return err
    }

    err = ms.Decode(source)
    if err != nil {
        return err
    }

func customHook(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) {
if f.Kind() == reflect.Int && t.Kind() == reflect.Bool {
    var result bool
    if data == 1 {
        result = true
    }
    return result, nil

}

Так что вы можете технически декодировать все, что угодно, используя пользовательские хуки, если у вас есть собственный лог c .

1 голос
/ 25 января 2020

Использовать вложенные для циклов:

for _, c := range source {
    oc := OldCategory{OldA: c.A}
    for _, sc := range c.SubCategory {
        oc.OldSubCategory = append(oc.OldSubCategory, OldSubCategory{OldB: sc.B, OldC: sc.C})
    }
    target = append(target, oc)
}
0 голосов
/ 25 января 2020

В Go есть способ преобразовать карту структуры в фрагмент структуры

Нет, для этого нет языковой конструкции или синтаксического сахара.

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