Assertion de type dans Go : utilisation de Reflect.TypeOf() pour la validation de l'interface
Dans Go, l'assertion de type permet la récupération du type spécifique d'une valeur d'interface. Cependant, lorsque vous utilisez reflect.TypeOf() pour obtenir le type d'une valeur, le résultat est de type Type, qui n'est pas directement convertible en un type spécifique.
Comprendre le problème :
L'extrait de code fourni dans la question tente de saisir une valeur d'interface (i) dans une structure Article. Cependant, il rencontre une erreur car Reflect.TypeOf(i) renvoie une valeur Type, et non un type spécifique qui peut être directement affirmé.
Solutions alternatives :
Pour pour résoudre ce problème, il existe plusieurs options :
Au lieu de vous fier à l'assertion de type, vous pouvez directement activer le type de valeur d'interface. Cette approche est adaptée lorsque vous souhaitez effectuer des actions en fonction du type de l'interface.
switch i.(type) { case Article: // Execute actions specific to Article default: // Handle other types or return an error }
Si vous devez examiner les types d'attributs dans une interface, vous pouvez utiliser la réflexion pour parcourir ses champs et déterminer les types de chacun
s := reflect.ValueOf(x) for i := 0; i < s.NumField(); i++ { switch s.Field(i).Interface().(type) { case int: // Execute actions for integer attributes default: // Handle other types or return an error } }
Vous pouvez également implémenter des fonctions d'assertion de type personnalisées qui prennent une valeur d'interface et renvoient une valeur spécifique. tapez s'il correspond au type de l'interface.
func AssertArticle(i interface{}) (Article, bool) { v, ok := i.(Article) return v, ok }
En fin de compte, la meilleure approche pour l'assertion de type dépend de vos besoins spécifiques et si vous devez inspecter le type de la valeur de l'interface ou ses attributs.
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!