猿问

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

我正在尝试借助 mapstructure 库将地图解码为结构类型。如果我使用普通变量进行解码,它可以解码,但如果我传递结构字段,它不会解码地图:


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


}

您能否澄清我是否为地图解码传递了错误的存储空间,或者这只是地图结构限制,我无法将地图解码为结构字段?谢谢你!


手掌心
浏览 118回答 2
2回答

翻阅古今

我认为你必须稍微改变一下实现var p1 Personmapstructure.Decode(p_map, &p1)b := Bundle{    p1,}print(b.Struct.(Person).Name) // John will appear我正在尝试上面的代码,但导致 empty Person。也许Decode函数不能改变的实际值b.Struct(我不确定确切的原因,这只是我的意见),但如果我Person先解码为结构然后分配给Bundle那个作品。更新:通过一些研究,我发现了问题所在。您必须使用指针而不是结构。这里是更新的代码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}

斯蒂芬大帝

将 Bundle 中的 Struct 字段类型从 interface{} 更改为 Person 后,它对我有用。type Bundle struct {    Struct Person}print(b.Struct.Name)
随时随地看视频慕课网APP

相关分类

Go
我要回答