在 Go 中有一种方法可以将结构映射转换为结构切片
In Go is there a way to convert map of structure to slice of structure
我必须在 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"`
}
我指的是地图结构包 ("github.com/mitchellh/mapstructure")。
从源转换为目标的一种方法是迭代所有 SubCategory,然后迭代源实例中的 Category,并使用 mapstructure.Decode() 单独转换每一个。
有没有直接使用 mapstructure 包的方法,其中我使用 NewDecoder 和 DecoderConfig.DecodeHook 创建自定义解码器挂钩,每当我遇到源作为结构映射和目标作为结构切片时,我处理它在 DecodeHookFunc 函数中。
mapstructure的相关文档
https://godoc.org/github.com/mitchellh/mapstructure#NewDecoder
使用嵌套 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)
}
In Go is there a way to convert map of structure to slice of structure
不,没有语言结构或语法糖。
您可以使用 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
}
因此,只要它具有您的自定义逻辑,您就可以使用自定义挂钩从技术上将任何内容解码为任何内容。
我必须在 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"`
}
我指的是地图结构包 ("github.com/mitchellh/mapstructure")。 从源转换为目标的一种方法是迭代所有 SubCategory,然后迭代源实例中的 Category,并使用 mapstructure.Decode() 单独转换每一个。
有没有直接使用 mapstructure 包的方法,其中我使用 NewDecoder 和 DecoderConfig.DecodeHook 创建自定义解码器挂钩,每当我遇到源作为结构映射和目标作为结构切片时,我处理它在 DecodeHookFunc 函数中。
mapstructure的相关文档 https://godoc.org/github.com/mitchellh/mapstructure#NewDecoder
使用嵌套 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)
}
In Go is there a way to convert map of structure to slice of structure
不,没有语言结构或语法糖。
您可以使用 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
}
因此,只要它具有您的自定义逻辑,您就可以使用自定义挂钩从技术上将任何内容解码为任何内容。