如何在 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。
我的系统中有多个节点通过 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 会导致恐慌。
我参考了
不幸的是,使用 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。