Lorsque vous travaillez avec des interfaces dans Go, il peut parfois être nécessaire de déterminer le type de la valeur sous-jacente. C’est là que le package Reflect entre en jeu. La fonction Reflect.TypeOf() peut être utilisée pour obtenir le type d'une valeur d'interface. Cependant, l'assertion de type nécessite un type spécifique, pas seulement un objet Type.
Dans le code fourni, une tentative est faite pour effectuer une assertion de type sur le résultat de réflexion.TypeOf( i):
item2 := i.(reflect.TypeOf(i)) // reflect.TypeOf(i) is not a type
Cette ligne échouera car reflex.TypeOf(i) renvoie un objet Type, pas un type spécifique qui peut être utilisé pour le type assertion.
Il existe plusieurs façons d'aborder ce scénario. Une option consiste à utiliser un commutateur de type sur la valeur de l'interface elle-même, comme suggéré dans la réponse :
switch x.(type){ case int: dosomething() }
Cette approche vérifie le type de la valeur stockée dans l'interface et effectue des actions en conséquence. Cela ne nécessite pas de réflexion de type.
Alternativement, si vous avez spécifiquement besoin d'accéder et d'activer le type d'attributs dans l'interface, vous pouvez utiliser l'approche suivante :
s := reflect.ValueOf(x) for i:=0; i<s.NumValues; i++{ switch s.Field(i).Interface().(type){ case int: dosomething() } }
Cela implique parcourir les champs de l'interface, obtenir leurs valeurs et effectuer une vérification de type sur ces valeurs.
Bien que cette approche ne soit pas aussi concise que l'utilisation d'un commutateur de type sur l'interface valeur elle-même, elle permet plus de flexibilité dans la gestion des différents types d'attributs au sein de l'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!