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

Мне нужно преобразовать карту структуры в фрагмент структуры в 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, и всякий раз, когда я встречаю источник как карту структуры и цель как фрагмент структуры, я обрабатываю его в функции DecodeHookFunc.

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

3 ответа

Решение

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

Пример:

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

}

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

Используйте вложенные циклы for:

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

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

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

Другие вопросы по тегам