Éviter le débordement de pile lors de l'appel de json.Unmarshal dans UnmarshalJSON
L'appel de json.Unmarshal(b, type) dans votre implémentation personnalisée d'UnmarshalJSON peut entraîner à une erreur de débordement de pile. Cela se produit car le décodeur JSON tente à plusieurs reprises de trouver une implémentation UnmarshalJSON personnalisée pour le type, ce qui entraîne une boucle infinie.
Solution : créer un nouveau type
Pour éviter ce problème, créez un nouveau type à l’aide du mot-clé type. Ce nouveau type n'héritera pas des méthodes du type d'origine, y compris UnmarshalJSON.
type person2 Person
Utilisation :
Convertissez la valeur du type d'origine vers le nouveau type à l'aide d'un taper conversion :
if err := json.Unmarshal(data, (*person2)(p)); err != nil { return err }
Exemple :
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 }
Avantages :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!