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
Lepaskan: 2024-11-26 04:26:12
asal
436 orang telah melayarinya

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}
}
Salin selepas log masuk

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}
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan