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

Barbara Streisand
Lepaskan: 2024-10-25 09:26:02
asal
619 orang telah melayarinya

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

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

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

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!