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
Patricia Arquetteasal
2024-11-26 20:11:11230semak imbas

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
}

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) 
}

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!

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