Rumah >pembangunan bahagian belakang >Golang >Mengapakah `json.Unmarshal` Gagal Apabila Menggunakan Antara Muka Daripada Structs?

Mengapakah `json.Unmarshal` Gagal Apabila Menggunakan Antara Muka Daripada Structs?

Patricia Arquette
Patricia Arquetteasal
2024-11-26 04:26:12391semak imbas

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

Menyahmarshall JSON kepada Structs not Interface

Apabila menyahmarshall data JSON menggunakan json.Unmarshal, adalah penting untuk menyediakan jenis konkrit untuk pembolehubah destinasi untuk mengelakkan penukaran yang tidak dijangka.

Dalam kod yang anda berikan, anda mentakrifkan fungsi getFoo() yang mengembalikan antara muka yang mengandungi struct Foo. Apabila anda menghantar antara muka ini kepada json.Unmarshal, ia mentafsir nilai sebagai peta, bukan struct konkrit.

Untuk menangani isu ini, anda boleh sama ada menghantar penunjuk kepada struct konkrit dalam antara muka atau menentukan taip struktur konkrit terus dalam json.Unmarshal.

Berikut ialah contoh menggunakan penunjuk:

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}
}

Sebagai alternatif, anda boleh menggunakan penegasan jenis untuk menentukan jenis konkrit:

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}
}

Dengan menyediakan jenis konkrit, sama ada melalui penuding atau penegasan jenis, anda memastikan bahawa json.Unmarshal secara langsung menyahmarshal data ke dalam struct yang diingini, mengekalkan maklumat jenis dan nilai medannya.

Atas ialah kandungan terperinci Mengapakah `json.Unmarshal` Gagal Apabila Menggunakan Antara Muka Daripada Structs?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn