为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中有没有办法将结构映射转换为结构切片

在 Go 中有没有办法将结构映射转换为结构切片

Go
偶然的你 2022-05-10 14:03:47
我必须将结构映射转换为 Golang 中的结构切片,即下面指定的源结构到目标结构。// Sourcevar source map[string]Categorytype Category struct {    A           int    SubCategory map[string]SubCategory}type SubCategory struct {    B int    C string}// Targetvar target []OldCategorytype 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
查看完整描述

3 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

您可以使用 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


}

因此,只要它具有您的自定义逻辑,您就可以使用自定义挂钩从技术上将任何内容解码为任何内容。


查看完整回答
反对 回复 2022-05-10
?
FFIVE

TA贡献1797条经验 获得超6个赞

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

}


查看完整回答
反对 回复 2022-05-10
?
慕村9548890

TA贡献1884条经验 获得超4个赞

在 Go 中有没有办法将结构映射转换为结构切片

不,对此没有语言结构或语法糖。


查看完整回答
反对 回复 2022-05-10
  • 3 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信