Question :
Dans Go, j'ai une structure en une package qui implémente une interface. Dans un autre package dépendant, je souhaite créer une fausse implémentation de cette structure à des fins de test. Cependant, Go se plaint de la sécurité des types lorsque j'essaie d'attribuer une fonction renvoyant une structure qui implémente l'interface à une variable de cette interface.
Architecture :
// Package expensive type myStruct struct{} func (m *myStruct) DoSomething() {...} func (m *myStruct) DoSomethingElse() {...} func CreateInstance() *myStruct {...} // Expensive to call // Package main type myInterface interface { DoSomething() } type structToConstruct struct { factoryFunction func() myInterface } func (s *structToConstruct) performAction() {...}
Erreur :
"impossible d'utiliser cher.CreateInstance (tapez func() *expensive.myStruct) en tapant func() myInterface dans la valeur du champ"
Réponse :
Le problème se pose car la fonction CreateInstance renvoie une valeur *myStruct, qui diffère à partir du type func() myInterface requis par factoryFunction. Pour résoudre ce problème :
// Package main type myInterface interface { DoSomething() } type myStruct struct{} func (m *myStruct) DoSomething() {...} func getInstance() myInterface { return &myStruct{} }
Avec cette modification, getInstance renvoie désormais un type myInterface, lui permettant d'être attribué à factoryFunction.
Remarques supplémentaires :
wrapper := func() myInterface { return expensive.CreateInstance() }
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!