Maison  >  Article  >  développement back-end  >  Comment résoudre l'erreur « Opération invalide : l'interface de type {} ne prend pas en charge l'indexation » dans Go ?

Comment résoudre l'erreur « Opération invalide : l'interface de type {} ne prend pas en charge l'indexation » dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-27 04:44:30510parcourir

How to Resolve the

Indexation des types d'interface dans Go : résolution de l'erreur "Opération non valide"

Dans Go, rencontre de l'erreur "Opération non valide : type interface { } ne prend pas en charge l'indexation" lorsque tenter d'indexer un type d'interface (interface{}) peut être frustrant. Cette erreur se produit lorsque vous essayez d'accéder à un champ ou à une méthode d'une interface sans l'affirmer au préalable à un type de données spécifique.

Problème :

Considérez l'extrait de code suivant :

<code class="go">var d interface{}
json.NewDecoder(response.Body).Decode(&d)
test := d["data"].(map[string]interface{})["type"]</code>

Lorsque vous essayez d'accéder au champ "type" de la réponse JSON imbriquée stockée dans d, vous pouvez rencontrer l'erreur "opération invalide". En effet, d est de type interface{}, qui fait abstraction de n'importe quel type et ne prend pas automatiquement en charge l'indexation.

Solution :

Pour résoudre cette erreur, vous devez pour effectuer des assertions de type pour convertir l'interface en un type connu prenant en charge l'indexation. Dans ce cas, puisque vous vous attendez à ce que d soit une carte, vous pouvez utiliser le code suivant :

<code class="go">test := d.(map[string]interface{})["data"].(map[string]interface{})["type"]
fmt.Println(test)</code>

Tout d'abord, vous affirmez que d est une map[string]interface{}. Cela vous permet de l'indexer par clés de chaîne. Ensuite, vous accédez au champ « données » et répétez le processus d'assertion pour obtenir sa valeur.

Approche alternative :

Alternativement, vous pouvez déclarer d comme étant map[ string]interface{} directement, éliminant le besoin de la première assertion de type :

<code class="go">var d map[string]interface{}
if err := json.NewDecoder(response.Body).Decode(&d); err != nil {
    panic(err)
}
test := d["data"].(map[string]interface{})["type"]
fmt.Println(test)</code>

Ce code conserve la même fonctionnalité que l'approche précédente.

Remarque supplémentaire :

Si vous rencontrez fréquemment ce problème d'indexation, envisagez d'utiliser une bibliothèque comme github.com/icza/dyno, qui simplifie le travail avec des objets dynamiques dans Go.

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