Maison >développement back-end >Golang >Pourquoi une fonction Go renvoyant un pointeur Struct n'implémente-t-elle pas automatiquement une interface ?
Implémentation d'interface dans Go : types de fonctions renvoyant des structures
Lorsque vous travaillez avec Go, il est courant de rencontrer des situations où une fonction renvoie une structure qui implémente une interface. Cependant, vous pouvez rencontrer une erreur similaire à « Impossible d'utiliser [fonction] comme type [interface] dans la valeur du champ » lorsque vous tentez d'attribuer la fonction à un champ qui attend une instance de l'interface.
Pour comprendre cela erreur, il est crucial de préciser qu'une fonction qui renvoie un pointeur vers une structure (struct) n'implémente pas automatiquement une interface définie pour cette structure. En d'autres termes, struct et struct sont des types distincts dans Go.
Dans l'exemple donné, la fonction getInstance devrait renvoyer une valeur de type myInterface, qui est une description du comportement (interface) plutôt qu'une implémentation spécifique (struct). Cependant, getInstance renvoie un pointeur vers l'implémentation myStruct (*myStruct), qui n'est pas compatible de type avec myInterface.
Pour résoudre ce problème, vous devez modifier getInstance pour renvoyer une instance du myStruct struct, comme le montre le code corrigé ci-dessous :
package main import "fmt" func main() { var function func() myInterface function = getInstance newSomething := function() newSomething.doSomething() } type myInterface interface { doSomething() } type myStruct struct{} func (m *myStruct) doSomething() { fmt.Println("doing something") } func getInstance() myInterface { return &myStruct{} }
Cette modification garantit que myStruct implémente l'interface myInterface et l'interface myStruct. La fonction
getInstancerenvoie le bon type.
Bien que l'approche ci-dessus fonctionne, Go a proposé un changement de langage pour convertir automatiquement une fonction renvoyant un type concret en une fonction renvoyant une interface si le type concret implémente l'interface. Cependant, cette proposition a été rejetée en raison de problèmes potentiels de performances et de sécurité.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!