小唯快跑啊
如果您不知道消息中的内容,则可能有几种情况。取决于类型的消息内容类型通常由某个类型字段指示。在这种情况下,您可以使用包含所有类型字段的“联合”结构:type Foo struct { A int B string}type Bar struct { C int D string}type Message struct { Type string Foo Bar}// or this, if you have common fieldstype Message struct { Type string A int B string C int D string}将消息解组到联合结构中,按类型分派,然后选择子结构。var m Messagejson.Unmarshal(data, &m)switch m.Type { case "foo": ... case "bar": ...}完全动态消息在这种情况下,您有一组不相关的键值并单独处理它们。解析为map[string]interface{}. 当然,缺点是您必须强制转换每个值并动态检查其类型。警告: map[string]interface{}将所有数字转换为浮点数,甚至是整数,因此您已将它们转换为float64.map[string]json.RawMessage如果您不想解析值,也可以使用,只有键(json.RawMessage是 a []byte,并且在解组时保持原样)。带有动态负载的“信封”消息例如:{ "type": "foo", "payload": { "key1": "value1" }}{ "type": "bar", "payload": { "key2": "value2", "key3": [1, 2] }}将结构与json.RawMessage.type Message struct { Type string Payload json.RawMessage}type Foo struct { Key1 string}type Bar struct { Key2 string Key3 []int}解析信封(有效载荷将被保留),然后按类型分派,并将有效载荷解析为子结构。var m Message_ = json.Unmarshal(data, &m)switch m.Type { case "foo": var payload Foo _ = json.Unmarshal(m.Payload, &payload) // do stuff case "bar": var payload Bar _ = json.Unmarshal(m.Payload, &payload) // do stuff}