我的系统中有多个通过 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(使用前将#替换为@)