Heim >Backend-Entwicklung >Golang >Wie müssen Go-Strukturmethoden mit Schnittstellendefinitionen übereinstimmen, um Typkonflikte zu vermeiden?

Wie müssen Go-Strukturmethoden mit Schnittstellendefinitionen übereinstimmen, um Typkonflikte zu vermeiden?

Susan Sarandon
Susan SarandonOriginal
2024-12-15 02:16:13877Durchsuche

How Do Go Struct Methods Need to Match Interface Definitions to Avoid Type Mismatches?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn