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
Freigeben: 2024-12-15 02:16:13
Original
871 Leute haben es durchsucht

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
}
Nach dem Login kopieren

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{})
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage