Maison  >  Article  >  développement back-end  >  Pouvez-vous invoquer une méthode Struct dans Go en utilisant uniquement son nom de chaîne via réflexion ?

Pouvez-vous invoquer une méthode Struct dans Go en utilisant uniquement son nom de chaîne via réflexion ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-24 00:47:10471parcourir

Can You Invoke a Struct Method in Go Using Only Its String Name Through Reflection?

Réflexion : accès aux structures par chaîne

Considérez un scénario dans lequel vous avez une structure avec une méthode spécifique :

type MyStruct struct {
}

func (a *MyStruct) AAction() {
    fmt.Println("Hello a")
}

Pour invoquer dynamiquement la méthode AAction en utilisant la réflexion, vous pouvez effectuer les opérations suivantes (valide approche) :

reflect.New(reflect.TypeOf(MyStruct{})).MethodByName("AAction").Call([]reflect.Value{})

Cependant, utiliser MyStruct{} comme expression n'est pas l'approche souhaitée. Au lieu de cela, vous souhaitez spécifier le nom de la structure sous forme de chaîne. Cette approche est actuellement inaccessible :

theStruct := "MyStruct"
theAction := "AAction"
reflect.New(reflect.TypeOf(theStruct)).MethodByName(theAction).Call([]reflect.Value{})

Malheureusement, cette tentative est erronée car réflexion.TypeOf(theStruct) donnera lieu à la chaîne de type.

Sur la base de vos recherches, vous avez rencontré un problème similaire question concernant l'appel d'une méthode struct par son nom à l'aide d'une chaîne. Cependant, l'approche suggérée de correspondance de chaînes n'est pas une solution viable.

Réponse :

Malgré vos aspirations, il n'est pas possible d'invoquer une méthode struct utilisant uniquement une chaîne représentant le nom de la structure. Cela est vrai car la réflexion nécessite pour fonctionner une valeur concrète du type en question. Sans valeur, il n'y a aucun moyen d'interagir avec la structure ou ses méthodes.

Pour obtenir la fonctionnalité souhaitée, vous devrez maintenir un registre personnalisé qui mappe les noms de structure à leurs types correspondants. Ce registre vous permettrait de récupérer le type en fonction du nom de la chaîne, puis d'utiliser la réflexion comme d'habitude. Cependant, cette approche nécessite des efforts supplémentaires et peut ne pas convenir à tous les scénarios.

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