Rumah >pembangunan bahagian belakang >Golang >Mengapakah `json.Unmarshal` Gagal Apabila Menggunakan Antara Muka Daripada Structs?
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!