在此場景中,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中文網其他相關文章!