Appelez json.Unmarshal dans UnmarshalJSON sans provoquer de débordement de pile
Problème :
Implémentations personnalisées d'UnmarshalJSON qui appeler json.Unmarshal peut conduire à une pile débordements.
Solution :
Pour éviter le problème de débordement de pile lors de l'appel de json.Unmarshal dans UnmarshalJSON, utilisez la technique suivante :
Raisonnement :
L'utilisation du mot-clé type pour créer un nouveau type supprime efficacement toutes les méthodes du type d'origine. Lorsque le type de wrapper est utilisé pendant le processus de démarshalage, le décodeur JSON ne trouvera pas d'implémentation UnmarshalJSON personnalisée et utilisera celle par défaut. Cela évite le problème de débordement de pile.
Exemple :
Considérez un type de personne avec un champ Âge :
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 }
Cette technique permet une personnalisation post-traitement après le démarshalage, tout en évitant le problème de débordement de pile associé à l'appel de json.Unmarshal dans DémarshalJSON.
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!