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

How to unmarshal from interface{} to interface{} in Go

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

我参考了 。但是为此,我们需要知道数据的类型。在我的例子中,数据可以是任何类型,所以我想将它保留为接口{}。如何从 interface{} 解组到 interface{}?

不幸的是,使用 encoding/json 包你不能,因为类型信息不会被传输,如果类型信息是不存在。您需要定义 struct 类型,其中您明确声明该字段的类型为 uint32.

或者您可以选择使用 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)

输出(在 Go Playground 上尝试):

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

gob 的缺点是它是特定于 Go 的,不像语言和平台无关 JSON。