首頁 >後端開發 >Golang >在Go中將JSON解組到interface{}後如何有效處理類型斷言?

在Go中將JSON解組到interface{}後如何有效處理類型斷言?

Patricia Arquette
Patricia Arquette原創
2024-12-24 15:56:11608瀏覽

How Can I Efficiently Handle Type Assertion After Unmarshalling JSON into interface{} in Go?

解組到 Interface{} 以進行 Golang 中的類型斷言

在此場景中,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)

    // ...
}

使用解包器struct

如果直接解組不可行,可以使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn