Maison > développement back-end > Golang > La réflexion de Go peut-elle créer des fonctions implémentant des interfaces prédéfinies ?

La réflexion de Go peut-elle créer des fonctions implémentant des interfaces prédéfinies ?

Mary-Kate Olsen
Libérer: 2024-12-11 18:18:12
original
966 Les gens l'ont consulté

Can Go's Reflection Create Functions Implementing Predefined Interfaces?

Extension des capacités de réflexion de Go

Question :

Est-il possible de créer dynamiquement une fonction qui implémente une interface prédéfinie dans Allez utiliser réflexion ?

Réponse :

Dans la version originale de Go, il n'était pas possible de créer de nouveaux types avec des méthodes attachées via la réflexion. Cependant, avec la sortie de Go 1.5, les fonctions réflexion.FuncOf et réflexion.MakeFunc ont été introduites pour répondre exactement à ce besoin.

Ces fonctions vous permettent de définir un type de fonction et de créer une valeur de fonction qui adhère à celui-ci. tapez :

funcType := reflect.FuncOf([]reflect.Type{reflect.TypeOf("")}, []reflect.Type{reflect.TypeOf("")})
fn := reflect.MakeFunc(funcType, func(args []reflect.Value) []reflect.Value { ... })
Copier après la connexion

Le premier argument à refléter.MakeFunc est le type de fonction, tandis que le deuxième argument est une valeur de fonction qui implémente cela type.

Dans le contexte de l'exemple donné :

type MyService interface {
  Login(username, password string) (sessionId int, err error)
  HelloWorld(sessionId int) (hi string, err error)
}
Copier après la connexion

Vous pouvez créer une fonction qui implémente cette interface en utilisant la réflexion comme suit :

fn := reflect.MakeFunc(reflect.TypeOf((*MyService)(nil)).Elem(), func(args []reflect.Value) []reflect.Value {
  switch args[0].String() {
  case "Login":
    return []reflect.Value{
      reflect.ValueOf(1),
      reflect.ValueOf(nil),
    }
  case "HelloWorld":
    return []reflect.Value{
      reflect.ValueOf("Hello, world!"),
      reflect.ValueOf(nil),
    }
  }
  return []reflect.Value{
    reflect.Value{},
    reflect.ValueOf(errors.New("Method not found")),
  }
})
Copier après la connexion

Cette implémentation utilise une instruction switch pour déterminer quelle méthode de l'interface appeler en fonction du premier argument. Il renvoie ensuite les valeurs appropriées pour les arguments de sortie.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal