Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa JSON Unmarshal Mengembalikan Peta Daripada Struct in Go Apabila Bekerja dengan Antara Muka?

Mengapa JSON Unmarshal Mengembalikan Peta Daripada Struct in Go Apabila Bekerja dengan Antara Muka?

Barbara Streisand
Barbara Streisandasal
2024-10-25 09:26:02605semak imbas

Why Does JSON Unmarshal Return a Map Instead of a Struct in Go When Working with Interfaces?

Misteri Di Sebalik JSON Unmarshal Mengembalikan Peta Daripada Struktur Yang Dimaksudkan

Pembubaran JSON dalam Go boleh menimbulkan cabaran apabila berurusan dengan antara muka dan struktur. Pembangun mungkin menghadapi situasi di mana proses unmarshal menghasilkan peta dan bukannya struct yang dijangkakan, seperti yang berlaku dalam coretan yang diberikan:

<code class="go">import "encoding/json"
import "fmt"
import "reflect"

func main() {
    type Ping struct {
        ID int `json:"id"`
    }
    var ping interface{} = Ping{}
    if err := json.Unmarshal([]byte(`{"id":42}`), &ping); err != nil {
        panic(err)
    }
    fmt.Println("Unexpected:", ping) // Result: map[id:42]
}</code>

Sebab yang mendasari tingkah laku ini terletak pada sifat abstrak antara muka. Apabila pembongkaran JSON dilakukan pada antara muka, hasilnya ialah peta yang mewakili medan jenis asas. Dalam contoh di atas, antara muka Ping memegang peta dengan pasangan nilai kunci tunggal: {"id":42}.

Untuk membetulkan isu ini dan mendapatkan struct yang diingini, adalah penting untuk menghantar penunjuk kepada jenis struct tertentu:

<code class="go">type Ping struct {
    ID int `json:"id"`
}
func main() {
    var ping Ping
    if err := json.Unmarshal([]byte(`{"id":42}`), &ping); err != nil {
        panic(err)
    }
    fmt.Println("Success:", ping) // Result: {42}
}</code>

Dengan menghantar penuding kepada Ping, proses unmarshal JSON diarahkan untuk mencipta instance struct dan mengisi medannya daripada mencipta peta.

Sebagai alternatif, jika penunjuk kepada struct konkrit tidak tersedia, anda boleh menggunakan refleksi untuk mencipta penunjuk secara dinamik dan seterusnya memberikan nilainya kepada antara muka:

<code class="go">import "reflect"

func main() {
    var ping interface{} = Ping{}
    nptr := reflect.New(reflect.TypeOf(ping))
    if err := json.Unmarshal([]byte(`{"id":42}`), nptr.Interface()); err != nil {
        panic(err)
    }
    ping = nptr.Elem().Interface()
    fmt.Println("Reflect-Based:", ping) // Result: {42}
}</code>

Atas ialah kandungan terperinci Mengapa JSON Unmarshal Mengembalikan Peta Daripada Struct in Go Apabila Bekerja dengan Antara Muka?. 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