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