Maison >développement back-end >Golang >Pouvez-vous appeler dynamiquement des méthodes Struct dans Go à l'aide de chaînes de type ?

Pouvez-vous appeler dynamiquement des méthodes Struct dans Go à l'aide de chaînes de type ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-16 18:45:03671parcourir

Can You Dynamically Invoke Struct Methods in Go Using Type Strings?

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!

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