Maison >développement back-end >Golang >Pouvez-vous appeler dynamiquement des méthodes Struct dans Go à l'aide de chaînes de type ?
Réflexion : appel dynamique de méthodes Struct via des identifiants de chaîne
Dans Go, la réflexion permet l'examen et la manipulation de types et de valeurs au moment de l'exécution. Avec réflexion, il est possible d'appeler dynamiquement une méthode struct en utilisant son identifiant de chaîne. Cependant, que se passe-t-il si nous voulons invoquer la méthode en utilisant une représentation sous forme de chaîne du type struct au lieu de créer explicitement une instance ?
L'extrait de code d'origine fourni tente de le faire, mais il échoue car reflet.TypeOf() attend une valeur, pas une chaîne de type. La réponse acceptée suggère de faire correspondre le nom du type à une chaîne quelque part dans le code, codant ainsi en dur le mappage entre les noms de type et les structures.
Malheureusement, le package de réflexion de Go ne fournit pas de mécanisme intégré à cet effet. Pour réaliser ce que nous voulons, nous devons créer notre propre registre de types. Voici comment cela pourrait être fait :
package main import ( "fmt" "reflect" ) // Create a type registry to map type names to types var typeRegistry = make(map[string]reflect.Type) type MyStruct struct { } func (a *MyStruct) AAction() { fmt.Println("Hello a") } // Register the MyStruct type in the registry func init() { typeRegistry["MyStruct"] = reflect.TypeOf(MyStruct{}) } func main() { // Get the Type object for the struct from the registry structType := typeRegistry["MyStruct"] // Dynamically invoke the method using reflection reflect.New(structType).MethodByName("AAction").Call([]reflect.Value{}) }
En enregistrant le type dans le registre, nous pouvons maintenant récupérer dynamiquement l'objet Reflect.Type du registre en utilisant le nom de chaîne de la structure. Cela nous permet d'appeler la méthode struct de manière dynamique, même sans créer explicitement une instance de la struct.
En résumé, bien que le package de réflexion Go ne prenne pas directement en charge l'appel des méthodes struct à l'aide de chaînes de type, il est possible d'obtenir cette fonctionnalité en maintenant notre propre registre de types pour mapper les noms de types aux types. Cette approche offre de la flexibilité et élimine le besoin de coder en dur le mappage dans notre code.
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!