Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mengelakkan Limpahan Tindanan Apabila Memanggil `json.Unmarshal` Dalam `UnmarshalJSON`?

Bagaimana untuk Mengelakkan Limpahan Tindanan Apabila Memanggil `json.Unmarshal` Dalam `UnmarshalJSON`?

Susan Sarandon
Lepaskan: 2024-12-25 19:18:16
asal
841 orang telah melayarinya

How to Avoid Stack Overflow When Calling `json.Unmarshal` Within `UnmarshalJSON`?

Panggil json.Unmarshal Dalam UnmarshalJSON Tanpa Menyebabkan Limpahan Tindanan

Masalah:
Pelaksanaan tersuai bagi UnmarshalJSON panggil json.Unmarshal boleh membawa kepada tindanan melimpah.

Penyelesaian:

Untuk mengelakkan isu limpahan tindanan apabila memanggil json.Unmarshal dalam UnmarshalJSON, gunakan teknik berikut:

  1. Buat jenis baharu menggunakan kata kunci jenis, jadikan ia pembungkus daripada yang asal taip.
  2. Taip-tukar nilai asal kepada contoh jenis pembalut.
  3. Panggil json.Unmarshal pada objek jenis pembalut untuk melaksanakan unmarshaling.
  4. Selepas menyahmarshal , lakukan sebarang pemprosesan pasca tersuai pada yang asal taip.

Penaakulan:

Menggunakan kata kunci jenis untuk mencipta jenis baharu dengan berkesan mengalih keluar semua kaedah daripada jenis asal. Apabila jenis pembalut digunakan semasa proses unmarshaling, penyahkod JSON tidak akan menemui pelaksanaan UnmarshalJSON tersuai dan akan menggunakan yang lalai. Ini menghalang isu limpahan tindanan.

Contoh:

Pertimbangkan jenis Orang dengan medan Umur:

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func (p *Person) UnmarshalJSON(data []byte) error {
    type personWrapper Person
    if err := json.Unmarshal(data, (*personWrapper)(p)); err != nil {
        return err
    }

    // Post-processing after unmarshaling:
    if p.Age < 0 {
        p.Age = 0
    }
    return nil
}
Salin selepas log masuk

Teknik ini membenarkan tersuai pasca pemprosesan selepas unmarshal, sambil mengelakkan isu limpahan tindanan yang dikaitkan dengan memanggil json.Unmarshal dalam UnmarshalJSON.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Limpahan Tindanan Apabila Memanggil `json.Unmarshal` Dalam `UnmarshalJSON`?. 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