如何在Go中从interface{}解组到interface{}

2024-05-01

我的系统中有多个通过 RPC 进行通信的节点。我正在尝试通过 RPC 将 map[string] interface{} 发送到另一个节点。发送方使用 json.Marshal,接收方使用 json.Unmarshal 来获取地图。 假设在发送方,map 包含 [1] => 2,其中 2 的类型为 uint32。
问题是 Unmarshal 尝试查找基础数据的类型,并根据此处指定的默认行为将 2 转换为 float64 类型https://blog.golang.org/json-and-go https://blog.golang.org/json-and-go。后来,将 float64 转换为 uint32 会导致恐慌。

我提到如何在golang中将json解组到interface{}中? https://stackoverflow.com/questions/28254102/how-to-unmarshal-json-into-interface-in-golang。但为此,我们需要知道数据的类型。就我而言,数据可以是任何类型,因此我想将其保留为 interface{}。如何从interface{} 解组到interface{}?


不幸的是使用encoding/json https://golang.org/pkg/encoding/json/你不能打包,因为类型信息不会被传输,并且 JSON 数字默认被解组为以下值:float64如果类型信息不存在,则键入。你需要定义struct类型,您明确声明字段的类型uint32.

或者您可以选择使用encoding/gob https://golang.org/pkg/encoding/gob/它传输并保存类型信息。看这个例子:

m := map[string]interface{}{"1": uint32(1)}

b := &bytes.Buffer{}
gob.NewEncoder(b).Encode(m)

var m2 map[string]interface{}
gob.NewDecoder(b).Decode(&m2)
fmt.Printf("%T\n%#v\n", m2["1"], m2)

输出(尝试一下去游乐场 https://play.golang.org/p/lMSh_vLUQR):

uint32
map[string]interface {}{"1":0x1}

缺点是gob与独立于语言和平台的 JSON 不同,它是 Go 特定的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Go中从interface{}解组到interface{} 的相关文章

随机推荐