Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mencegah Ralat Limpahan Tindanan Apabila Menggunakan json.Unmarshal dalam UnmarshalJSON?

Bagaimana untuk Mencegah Ralat Limpahan Tindanan Apabila Menggunakan json.Unmarshal dalam UnmarshalJSON?

Susan Sarandon
Lepaskan: 2024-12-19 18:36:10
asal
1027 orang telah melayarinya

How to Prevent Stack Overflow Errors When Using json.Unmarshal within UnmarshalJSON?

Mengelakkan Limpahan Tindanan apabila Memanggil json.Unmarshal dalam UnmarshalJSON

Memanggil json.Unmarshal(b, type) dalam pelaksanaan UnmarshalJSON tersuai anda boleh membawa kepada ralat limpahan tindanan. Ini berlaku kerana penyahkod JSON berulang kali cuba mencari pelaksanaan UnmarshalJSON tersuai untuk jenis tersebut, menghasilkan gelung tak terhingga.

Penyelesaian: Cipta Jenis Baharu

Untuk mengelakkan isu ini, buat jenis baharu menggunakan kata kunci jenis. Jenis baharu ini tidak akan mewarisi kaedah jenis asal, termasuk UnmarshalJSON.

type person2 Person
Salin selepas log masuk

Penggunaan:

Tukar nilai jenis asal kepada jenis baharu menggunakan taip penukaran:

if err := json.Unmarshal(data, (*person2)(p)); err != nil {
    return err
}
Salin selepas log masuk

Contoh:

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

func (p *Person) UnmarshalJSON(data []byte) error {
    type person2 Person
    if err := json.Unmarshal(data, (*person2)(p)); err != nil {
        return err
    }
    // Custom processing
    if p.Age < 0 {
        p.Age = 0
    }
    return nil
}
Salin selepas log masuk

Faedah:

  • Menghalang limpahan tindanan
  • Tiada overhed masa jalan kerana perwakilan asas kekal tidak berubah

Atas ialah kandungan terperinci Bagaimana untuk Mencegah Ralat Limpahan Tindanan Apabila Menggunakan json.Unmarshal dalam UnmarshalJSON?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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