首頁 >後端開發 >Golang >為什麼使用介面而不是結構時'json.Unmarshal”會失敗?

為什麼使用介面而不是結構時'json.Unmarshal”會失敗?

Patricia Arquette
Patricia Arquette原創
2024-11-26 04:26:12391瀏覽

Why Does `json.Unmarshal` Fail When Using Interfaces Instead of Structs?

將 JSON 解組為結構而不是介面

使用 json.Unmarshal 解組 JSON 資料時,為目標變數提供具體類型以避免意外轉換非常重要。

在您提供的程式碼中,您定義了一個函數 getFoo() ,它會傳回一個包含 Foo 的介面結構。當您將此介面傳送到 json.Unmarshal 時,它會將值解釋為映射,而不是具體結構。

要解決此問題,您可以在介面中傳遞指向特定結構的指針,也可以指定直接在json.Unmarshal.

這裡是一個使用具體結構類型的範例指標:

func getFoo() interface{} {
    return &Foo{"bar"}
}

func main() {
    fooInterface := getFoo()

    jsonBytes := []byte(`{"bar":"This is the new value of bar"}`)

    err := json.Unmarshal(jsonBytes, fooInterface)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(fooInterface) // *main.Foo &{Bar:This is the new value of bar}
}

或者,您可以使用類型斷言來指定具體類型:

func main() {
    fooInterface := getFoo()

    jsonBytes := []byte(`{"bar":"This is the new value of bar"}`)

    foo := fooInterface.(*Foo)
    err := json.Unmarshal(jsonBytes, foo)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(foo) // &{Bar:This is the new value of bar}
}

透過指標或類型斷言提供具體類型,您可以確保json.Unmarshal直接將資料解組到所需的結構中,保留其類型資訊和欄位值。

以上是為什麼使用介面而不是結構時'json.Unmarshal”會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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