首頁 > 後端開發 > Golang > 為什麼我在 JSON 反序列化期間收到「介面轉換:interface {} is map[string]interface {},而不是 main.Data」錯誤?

為什麼我在 JSON 反序列化期間收到「介面轉換:interface {} is map[string]interface {},而不是 main.Data」錯誤?

Linda Hamilton
發布: 2024-11-14 12:33:02
原創
1090 人瀏覽過

Why am I getting an

JSON 反序列化期間介面轉換失敗

嘗試從JSON 反序列化複雜資料結構時,確保正確處理介面以避免出現問題至關重要運行時錯誤。考慮以下程式碼:

type Data struct {
    Content string
    Links   []string
}

func main() {
    anInterface := interface{}{/* JSON data here */}

    // Assertion to Data interface
    AData2 := anInterface.(Data)
}
登入後複製

執行時,程式會拋出錯誤:

panic: interface conversion: interface {} is map[string]interface {}, not main.Data
登入後複製

理解問題

錯誤源自於嘗試將包含字串介面對映射的介面直接斷言到資料結構中。 Go 期望介麵包含一個 Data 值,但實際內容是一個映射。

解決方案

要解決這個問題,必須了解介面的本質。介面只是一個契約,它定義了類型必須實作的一組方法。若要斷言特定類型的接口,該接口之前必須已填入該類型的值。

在這種情況下,應進行以下更改:

  1. 填充介面具有資料值:
anInterface = Data{Content: "hello world", Links: []string{"link1", "link2", "link3"}}
登入後複製
  1. 斷言資料:
AData2 = anInterface.(Data)
登入後複製

這可確保介面在嘗試將其轉換為資料之前包含正確的類型。

替代方法

另一種方法是直接將 JSON 資料解組為所需的資料結構:

var AData2 Data

err := json.Unmarshal([]byte(jsonStr), &AData2)
if err != nil {
    panic(err)
}
登入後複製

以上是為什麼我在 JSON 反序列化期間收到「介面轉換:interface {} is map[string]interface {},而不是 main.Data」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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