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 { ... })
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) }
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")), } })
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!