我正在尝试借助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
}
答案 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