Assertion de type à l'aide de Reflection dans Go
Dans Go, les assertions de type fournissent un mécanisme pour vérifier le type d'une valeur d'interface{} et convertir à un type spécifique s'il correspond. Cependant, vous pouvez parfois rencontrer des situations dans lesquelles vous devez affirmer un type renvoyé par Reflect.TypeOf() dans un type spécifique.
Problème : les assertions nécessitent un type, pas un type
Dans votre exemple, vous tentez d'affirmer un Type sur un type en utilisant la ligne suivante :
item2 := i.(reflect.TypeOf(i)) // reflect.TypeOf(i) is not a type
Ici, item2 ne sera pas valide car réfléchissant.TypeOf(i) renvoie un *reflect.Type, qui n'est pas un type en soi. Les assertions de type attendent un type, pas un descripteur de type.
Solution : Utiliser Type Switch
Une approche pour gérer cela consiste à utiliser un commutateur de type sur l'interface{ } valeur :
switch i.(type) { case *reflect.Type: // Code to handle reflect.Type here }
Cela vous permet d'effectuer des actions spécifiques en fonction du type réel de l'interface{} value.
Approche alternative : analyse par réflexion
Si vous devez affirmer des types spécifiques à partir d'une interface{}, vous pouvez utiliser la réflexion pour analyser les champs de la valeur :
s := reflect.ValueOf(i) for i := 0; i < s.NumField(); i++ { switch s.Field(i).Interface().(type) { case int: // Code to handle integer field here } }
Cette approche vous permet d'effectuer des vérifications de type sur des champs individuels au sein de l'interface{} value.
Conclusion :
Les assertions de type utilisant Reflect.TypeOf() dans Go nécessitent un type spécifique, pas un descripteur de type. Pour gérer de tels scénarios, vous pouvez utiliser des commutateurs de type ou une analyse par réflexion pour déterminer le type réel de la valeur 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!