Einschränkungen bei der Schnittstellenimplementierung für Strukturmethoden
In Go kann eine Struktur eine Schnittstelle nur implementieren, wenn sie eine Methode mit demselben Namen hat. Typ und Signatur als Schnittstellenmethode. Betrachten Sie den folgenden Code:
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 }
Hier lautet die Fehlermeldung: "kann d (Typ D) nicht als Typ B im Argument zum Testen verwenden: D wird nicht implementiert B (falscher Typ für Connect-Methode)“. Dies liegt daran, dass der Rückgabetyp der Connect-Methode von D *C ist, was nicht mit dem von der B-Schnittstelle angegebenen Rückgabetyp (A, Fehler) übereinstimmt.
Wenn sich die Methode einer Struktur in ihrem Parameter oder ihrer Rückgabe unterscheidet Typ aus der entsprechenden Schnittstellenmethode, die Struktur implementiert die Schnittstelle nicht.
Problem lösen
An Um dieses Problem zu lösen, muss die Connect-Methode von Struktur D mit der Connect-Methode von Schnittstelle B übereinstimmen. Dazu gehört sicherzustellen, dass sie den erwarteten Typ (A, Fehler) zurückgibt.
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{}) }
Mit dieser Änderung wird der Code kompiliert und läuft ohne Fehler, da die Connect-Methode von Struktur D nun der Definition der B-Schnittstelle entspricht.
Das obige ist der detaillierte Inhalt vonWie müssen Go-Strukturmethoden mit Schnittstellendefinitionen übereinstimmen, um Typkonflikte zu vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!