Maison >développement back-end >Golang >Comment puis-je gérer les fonctions Go renvoyant des structures implémentant des interfaces ?
Types de fonctions Go qui renvoient des structures à l'intérieur des interfaces
Dans Go, il est courant d'utiliser des interfaces pour définir le comportement des structures. Cependant, lorsque vous travaillez avec des fonctions qui renvoient des structures qui implémentent des interfaces, vous pouvez rencontrer des erreurs de sécurité de type.
Comprendre le problème
Examinons l'exemple de code que vous avez fourni :
package expensive type myStruct struct { ... } // Struct with time-consuming methods func CreateInstance() *myStruct { ... } // Expensive factory function
package main import "expensive" type myInterface interface { DoSomething() } type structToConstruct struct { factoryFunction func() myInterface } func (s *structToConstruct) performAction() { instance := s.factoryFunction(); instance.DoSomething() }
Ici, vous avez défini une fonction d'usine CreateInstance qui renvoie un *myStruct. Vous avez ensuite créé une interface myInterface que *myStruct implémente. Cependant, vous avez attribué la fonction d'usine à un champ dans structToConstruct qui attend une fonction renvoyant myInterface, provoquant l'erreur de compilation.
Résoudre le problème
Pour résoudre ce problème, vous avez deux options :
wrapper := func() myInterface { return expensive.CreateInstance() } thing := structToConstruct{wrapper}
func CreateInstance() myInterface { return &myStruct{} }
Pourquoi l'option 1 fonctionne
Dans l'option 1, le wrapper La fonction convertit le résultat de CreateInstance en myInterface avant de l'attribuer à factoryFunction. Cela satisfait la signature de type de structToConstruct car la fonction wrapper correspond au type de fonction attendu.
Pourquoi l'option 2 nécessite la proposition 12754
Dans l'option 2, si vous essayez de directement attribuez CreateInstance à factoryFunction, Go se plaindra car CreateInstance renvoie un pointeur structuré, pas une interface. La proposition 12754 suggère d'étendre le langage pour prendre en charge de telles affectations, mais elle a finalement été rejetée.
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!