Maison >développement back-end >Golang >Comment « json.Unmarshal » gère-t-il les interfaces et pourquoi la déclaration de type explicite est-elle cruciale ?

Comment « json.Unmarshal » gère-t-il les interfaces et pourquoi la déclaration de type explicite est-elle cruciale ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-02 13:23:11644parcourir

How Does `json.Unmarshal` Handle Interfaces, and Why Is Explicit Type Declaration Crucial?

Comprendre le comportement du démarshal JSON

Lorsque vous essayez de démarshaler des données JSON à l'aide de json.Unmarshal, il est crucial de comprendre comment le package interagit avec les types de variables .

L'Interface Erreur

Supposer que json.Unmarshal utilise automatiquement la structure concrète associée à une interface est une idée fausse courante. Le package nécessite des conseils explicites sur le type de démarshaling souhaité.

Exemple : Lost in Translation

Considérez l'exemple de code fourni :

type Foo struct {
    Bar string `json:"bar"`
}

func getFoo() interface{} {
    return Foo{"bar"}
}

Le l'intention est que getFoo() renvoie une structure Foo, mais comme elle est affectée à une interface, elle est traitée comme une carte. En effet, lorsque l'interface est transmise à json.Unmarshal, le package l'interprète comme une interface vide et génère une carte pour l'objet JSON.

La solution : déclaration de type explicite

Pour résoudre ce problème, transmettez explicitement un pointeur vers le type de structure souhaité dans l'interface :

func getFoo() interface{} {
    return &Foo{"bar"}
}

Maintenant, lorsque json.Unmarshal reçoit l'interface, il identifie le pointeur vers la structure et désorganise correctement les données JSON dans les champs de structure.

À retenir :

Rappelez-vous ce json. Unmarshal s'appuie sur les informations de type explicites fournies pour déterminer la destination du démarshalage. Si vous souhaitez qu'il utilise une structure spécifique, vous devez explicitement transmettre une valeur de ce type ou un pointeur vers ce type dans une interface.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn