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

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

Patricia Arquette
發布: 2024-12-24 15:56:11
原創
603 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板