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

时间:2018-09-07 06:06:41

标签: go

我正在尝试借助mapstructure库将地图解码为struct类型。如果我使用纯变量执行此操作,它将解码确定,但是如果传递struct字段,则不会解码该映射:

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

}

能否请您说明我是否将错误的存储空间传递给地图解码,或者仅仅是由于地图结构限制而无法将地图解码为结构字段?谢谢!

UPD

很抱歉,如果我对使用此流程的实际原因不够清楚:

我将HTTP请求发送到不同的资源,并获得具有不同字段的各种对象,因此最初我将它们收集为interface{}。获得特定的资源对象后,需要将其转换为特定的结构(在我的示例中为Person),因此我需要使用mapstructure.decode()函数。

由于我有各种以不同结构解码的对象,因此我想创建一个循环以避免代码重复。我想做的是创建一个具有不同结构的切片,例如:

bundles := []Bundle{
    {"person", Person{}}
    {"employee", Employee{}}
    ...
}

然后在循环中解码对象:

for bundle := range bundles {
    // map_storage contains different type maps that are going to be decoded into struct and key for the specific object is bundle name
    mapstructure.Decode(maps_storage[bundle.Name], &bundle.Struct)

    // bundle.Struct blank, but I expect that it is filled as in the example below
}

2 个答案:

答案 0 :(得分:0)

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

type Bundle struct {
    Struct Person
}
print(b.Struct.Name)

答案 1 :(得分:0)

我认为您必须稍微更改实施方式

var p1 Person

mapstructure.Decode(p_map, &p1)
b := Bundle{
    p1,
}

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

我正在上面尝试您的代码,但导致空白Person。也许Decode函数无法更改b.Struct的实际值(我不确定确切原因,这只是我的看法),但是如果我先解码为结构Person,然后将其赋给{ {1}}有效。

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

Bundle