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

如何在 mapstructure.decode 中传递结构字段的指针

如何在 mapstructure.decode 中传递结构字段的指针

Go
手掌心 2023-03-29 17:23:02
我正在尝试借助 mapstructure 库将地图解码为结构类型。如果我使用普通变量进行解码,它可以解码,但如果我传递结构字段,它不会解码地图:package mainimport (    "github.com/mitchellh/mapstructure")type Person struct {    Name string}type Bundle struct {    Name string    Struct interface{}}func main() {    p_map := map[string]string{        "Name": "John",    }    p := Person{}    mapstructure.Decode(p_map, &p)    print(p.Name) // shows name John    b := Bundle{        "person"        Person{},    }    mapstructure.Decode(p_map, &b.Struct)    print(b.Struct.(Person).Name) // Does not show any name. Blank}您能否澄清我是否为地图解码传递了错误的存储空间,或者这只是地图结构限制,我无法将地图解码为结构字段?谢谢你!
查看完整描述

2 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

我认为你必须稍微改变一下实现


var p1 Person


mapstructure.Decode(p_map, &p1)

b := Bundle{

    p1,

}


print(b.Struct.(Person).Name) // John will appear

我正在尝试上面的代码,但导致 empty Person。也许Decode函数不能改变的实际值b.Struct(我不确定确切的原因,这只是我的意见),但如果我Person先解码为结构然后分配给Bundle那个作品。


更新:通过一些研究,我发现了问题所在。您必须使用指针而不是结构。这里是更新的代码


package main


import (

    "github.com/mitchellh/mapstructure"

)


type Person struct {

    Name string

}


type Bundle struct {

    Name   string

    Struct interface{}

}


func main() {

    p_map := map[string]string{

        "Name": "John",

    }


    p := &Person{}

    mapstructure.Decode(p_map, &p)


    print(p.Name) // shows name John


    b := Bundle{

        "person",

        &Person{},

    }


    mapstructure.Decode(p_map, &b.Struct)


    print(b.Struct.(*Person).Name) // Does not show any name. Blank


}


查看完整回答
反对 回复 2023-03-29
?
斯蒂芬大帝

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

将 Bundle 中的 Struct 字段类型从 interface{} 更改为 Person 后,它对我有用。


type Bundle struct {

    Struct Person

}

print(b.Struct.Name)


查看完整回答
反对 回复 2023-03-29
  • 2 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

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