Rumah > pembangunan bahagian belakang > Golang > Pergi JSON Unmarshalling: Structs vs. Interfaces – Bila Perlu Menggunakan Penunjuk?

Pergi JSON Unmarshalling: Structs vs. Interfaces – Bila Perlu Menggunakan Penunjuk?

Patricia Arquette
Lepaskan: 2024-11-26 20:11:11
asal
150 orang telah melayarinya

Go JSON Unmarshalling: Structs vs. Interfaces – When to Use Pointers?

Menyahmarshall JSON ke dalam Structs vs. Interface

Dalam Go, pakej pengekodan/json menyediakan kefungsian untuk menukar data JSON kepada dan dari nilai Go . Apabila menyahmarshall JSON ke dalam struct, adalah penting untuk memahami bahawa pakej memerlukan arahan eksplisit pada jenis sasaran.

Secara lalai, apabila menyahmarshall JSON ke dalam antara muka, pakej memilih jenis yang sesuai berdasarkan struktur data. Untuk objek JSON, ia memilih peta[rentetan]antara muka{} dan untuk tatasusunan JSON, ia memilih []antara muka{}. Walau bagaimanapun, tingkah laku ini berbeza apabila berurusan dengan struct.

Untuk menyahmarshal JSON ke dalam struct tertentu, anda perlu menghantar penunjuk kepada struct sebagai parameter kedua json.Unmarshal(). Ini kerana Go secara automatik menyahrujuk penunjuk apabila menghantarnya kepada fungsi.

Walau bagaimanapun, jika anda cuba menyahmarshal JSON ke dalam antara muka{} pembolehubah yang mengandungi nilai struct bukan penuding, pakej tidak mempunyai cara untuk menentukan yang dimaksudkan jenis sasaran. Sebaliknya, ia akan mentafsir data sebagai peta atau kepingan, bergantung pada strukturnya.

Untuk menyelesaikan isu ini, anda harus membalut nilai struct anda dalam antara muka{} menggunakan rujukan penuding. Ini memastikan bahawa json.Unmarshal mempunyai maklumat yang diperlukan untuk menyahmarshal ke dalam jenis yang sesuai:

func getFoo() interface{} {
    return &Foo{"bar"} // Use a pointer wrapper
}
Salin selepas log masuk

Berikut ialah versi kod contoh yang lebih baik:

package main

import (
    "encoding/json"
    "fmt"
)

type Foo struct {
    Bar string `json:"bar"`
}  

func getFoo() interface{} {
    return &Foo{"bar"}
}

func main() {

    fooInterface := getFoo() 

    myJSON := `{"bar":"This is the new value of bar"}`
    jsonBytes := []byte(myJSON)

    err := json.Unmarshal(jsonBytes, fooInterface )
    if err != nil {
        fmt.Println(err)
    }
    fmt.Printf("%T %+v", fooInterface, fooInterface) 
}
Salin selepas log masuk

Kod yang dikemas kini ini akan berjaya dicetak struct Foo yang tidak dikawal dengan nilai "bar" yang dikemas kini.

Atas ialah kandungan terperinci Pergi JSON Unmarshalling: Structs vs. Interfaces – Bila Perlu Menggunakan Penunjuk?. 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