gpt4 book ai didi

dictionary - json解码后去映射结构类型转换

转载 作者:行者123 更新时间:2023-12-01 22:05:55 26 4
gpt4 key购买 nike

我正在尝试在 Go 中创建某种工厂模式,但没有任何运气。我希望能够使用反射,以其他语言的方式,使用对象名称动态创建对象/结构。但是,go 似乎并没有像我希望的那样支持它,所以我选择了一种更简单的方法(见下文),只需使用映射将结构映射到字符串。

我现在遇到的问题是,根据我的测试,它最初似乎可以工作,但是,一旦我调用 json.Unmarshal在它上面,它从正确的结构类型变为 map[string]interface{} ,好像它几乎恢复到包含对象的类型?

st := make(map[string]interface{})
st["StructName1"] = s.StructName1{}
st["StructName2"] = s.StructName2{}
//...

fmt.Printf("1) '%+v' '%+v'\n", reflect.ValueOf(st["StructName1"]), reflect.TypeOf(st["StructName1"]))
fmt.Printf("2) '%+v' '%+v'\n", reflect.ValueOf(s.StructName1{}), reflect.TypeOf(s.StructName1{}))

ff := st["StructName1"]
err := json.Unmarshal([]byte(reqBody), &ff)
fmt.Printf("3) '%+v' '%+v'\n", reflect.ValueOf(ff), reflect.TypeOf(ff))

输出:
1) '{V1: V2:{V2v1: V2v2: V2v3:}}' 'structs.StructName1'
2) '{V1: V2:{V2v1: V2v2: V2v3:}}' 'structs.StructName1'

3) 'map[V2:map[V2v1:value1 V2v2:value2 V2v3:value3] V1:"value4"]' 'map[string]interface {}'

解码“成功”,因为它没有错误,但在 3) 中打印的类型是 map[string]interface{} .任何想法为什么会这样?

此外,分配 ff直接使用结构而不是使用映射,即
ff := s.StructName1{}

工作得很好。

此外,如果您对 Go 中的更好方法有任何建议,我将不胜感激。

提前致谢。

最佳答案

"Any ideas why this is?"



存储在接口(interface)中的动态类型是不可寻址的,因此 json.Unmarshal ,正如 Cerise Limon 所指出的,将回退到将 json 解码为一种内置类型,一种最适合 json 数据的类型,例如一个 map[string]interface{} , 或 []interface{} , 或 string , ETC。

"if you have any advice on a better approach for this in go, I'd appreciate any input."



取决于你到底想要做什么,但是,为了简单地解决你当前的困境,你可以做一些像这样简单的事情:
st := make(map[string]func() interface{})
st["StructName1"] = func() interface{} { return &s.StructName1{} }
st["StructName2"] = func() interface{} { return &s.StructName2{} }

// ...

ff := st["StructName1"]()
err := json.Unmarshal([]byte(reqBody), ff)
fmt.Printf("'%T' '%+v'\n", ff, ff)

关于dictionary - json解码后去映射结构类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61861757/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com