猿问

在 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"`

}

我指的是地图结构包(“github.com/mitchellh/mapstructure”)。从源转换为目标的一种方法是在源实例中迭代所有子类别,然后是类别,并使用 mapstructure.Decode() 单独转换每个子类别。


有没有使用mapstructure包的直接方法,其中我使用NewDecoder和DecoderConfig.DecodeHook创建一个自定义解码器钩子,每当我遇到源作为结构的映射和目标作为结构的切片时,我都会在DecodeHookFunc函数中处理它。


mapstructure 的相关文档 https://godoc.org/github.com/mitchellh/mapstructure#NewDecoder


偶然的你
浏览 128回答 3
3回答

ITMISS

您可以使用 mapstructure 解码器挂钩,在解码器挂钩内编写自定义逻辑来完成您的工作。但是没有标准的 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}因此,只要它具有您的自定义逻辑,您就可以使用自定义挂钩从技术上将任何内容解码为任何内容。

FFIVE

使用嵌套的 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)}

慕村9548890

在 Go 中有没有办法将结构映射转换为结构切片不,对此没有语言结构或语法糖。
随时随地看视频慕课网APP

相关分类

Go
我要回答