在此场景中,JSON 字符串通过 RabbitMQ 传输。这些字符串表示两个不同结构 Somthing1 和 Somthing2 的实例。目标是将 JSON 字符串解组回各自的结构并执行类型断言。
乍一看,似乎是解组为接口{},然后应用类型断言应该足够了。然而,在解组时,输入变量的类型为map[string]interface{}。这与预期不符,尝试打开此类型或将其重新分配给所需的结构会失败。
Golang 中的 JSON 库解组为默认类型,例如 bool、float64和映射[字符串]接口{}。要获得所需的结构,您需要直接解组到它们或从map[string]interface{}手动转换。
首选方法是直接解组到结构体:
func typeAssert(msg string) { var job Somthing1 json.Unmarshal([]byte(msg), &job) // ... var stats Somthing2 json.Unmarshal([]byte(msg), &stats) // ... }
如果直接解组不可行,您可以使用 Unpacker 结构体来处理解组并提供访问数据的接口:
type Unpacker struct { Data interface{} } func (u *Unpacker) UnmarshalJSON(b []byte) error { // Attempt to unmarshal into both types smth1 := &Something1{} err := json.Unmarshal(b, smth1) if err == nil && smth1.Thing != "" { u.Data = smth1 return nil } smth2 := &Something2{} err = json.Unmarshal(b, smth2) if err != nil { return err } u.Data = smth2 return nil }
然后,您可以使用 Unpacker 来访问未编组的数据:
func typeAssert(msg string) { unpacker := &Unpacker{} json.Unmarshal([]byte(msg), unpacker) switch v := unpacker.Data.(type) { case Something1: // ... case Something2: // ... default: // Handle unknown type } }
以上是在Go中将JSON解组到interface{}后如何有效处理类型断言?的详细内容。更多信息请关注PHP中文网其他相关文章!