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
Susan Sarandonasal
2024-12-19 18:36:10961semak imbas

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

Penggunaan:

Tukar nilai jenis asal kepada jenis baharu menggunakan taip penukaran:

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

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
}

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:
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