Restrictions d'implémentation d'interface sur les méthodes Struct
Dans Go, une structure ne peut implémenter une interface que si elle a une méthode du même nom, type et signature comme méthode d’interface. Considérez le code suivant :
package main type A interface { Close() } type B interface { Connect() (A, error) } type C struct { /* ... */ } func (c *C) Close() {} type D struct { /* ... */ } func (d *D) Connect() (*C, error) { return &C{}, nil } // Return type mismatch func test(b B) {} func main() { d := &D{} test(d) // Error: type mismatch for Connect() method }
Ici, le message d'erreur est : "ne peut pas utiliser d (type D) comme type B dans l'argument pour tester : D n'implémente pas B (mauvais type pour la méthode Connect)". Cela se produit car le type de retour de la méthode Connect de D est *C, ce qui ne correspond pas au type de retour (A, erreur) spécifié par l'interface B.
Par conséquent, si la méthode d'une structure diffère dans son paramètre ou son retour tapez à partir de la méthode d'interface correspondante, la structure n'implémente pas l'interface.
Résoudre le problème
Pour résoudre ce problème problème, la méthode Connect de la struct D doit s'aligner sur la méthode Connect de l'interface B. Cela implique de s'assurer qu'elle renvoie le type attendu (A, erreur).
import "fmt" type A interface { Close() } type B interface { Connect() (A, error) } type C struct { name string } func (c *C) Close() { fmt.Println("C closed") } type D struct {} func (d *D) Connect() (A, error) { return &C{"D"}, nil } func test(b B) { b.Connect().Close() // Call Close() on the returned A } func main() { test(&D{}) }
Avec cette modification, le code compile et s'exécute sans erreur, car la méthode Connect de la structure D adhère désormais à la définition de l'interface B.
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!