Maison >développement back-end >Golang >Pourquoi une fonction Go renvoyant une structure implémentant une interface ne satisfait-elle pas un champ de fonction renvoyant une interface ?
Types de fonctions Go renvoyant des structures incompatibles avec les interfaces
Question :
Dans Go, pourquoi une fonction renvoyant une structure qui implémente une interface ne satisfait-elle pas à l'exigence de type d'un champ qui attend une fonction renvoyant cela interface ?
Réponse :
Le problème réside dans le fait qu'un type de fonction Go qui renvoie une structure n'est pas interchangeable avec un type de fonction qui renvoie une interface, même si la structure implémente l'interface. Lors de la déclaration d'une signature de type pour une fonction dans une structure, le type de retour spécifique doit correspondre au type déclaré. La modification de la fonction factory pour renvoyer le type d'interface résout directement le problème.
Exemple :
package main import "fmt" func main() { thing := structToConstruct{getInstance} thing.performAction() } type myInterface interface { doSomething() } type structToConstruct struct { factoryFunction func() myInterface } func (s *structToConstruct) performAction() { instance := s.factoryFunction() instance.doSomething() } func getInstance() myInterface { return &myStruct{} } type myStruct struct{} func (m *myStruct) doSomething() { fmt.Println("doing something") }
Dans cet exemple, la fonction factory est modifiée pour renvoyer une instance de myInterface, qui satisfait à l'exigence de type pour structToConstruct.
Explication :
Lors de la déclaration du type structToConstruct, nous spécifions que factoryFunction doit être une fonction qui renvoie une myInterface. Cependant, la fonction coûteuse.CreateInstance renvoie une valeur *myStruct, qui n'est pas directement attribuable à myInterface. En effet, les interfaces Go assurent la sécurité des types et une fonction qui renvoie un type de structure spécifique (par exemple, *myStruct) ne peut pas être automatiquement convertie en une fonction qui renvoie le type d'interface qu'elle implémente.
Pour utiliser *myStruct valeur avec myInterface, nous devons la convertir explicitement en utilisant une assertion de type ou en créant une fonction d'adaptateur qui encapsule la conversion :
func wrapper() myInterface { return expensive.CreateInstance() } thing := structToConstruct{wrapper}
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!