Heim >Backend-Entwicklung >Golang >Warum implementiert eine Go-Funktion, die einen Strukturzeiger zurückgibt, nicht automatisch eine Schnittstelle?

Warum implementiert eine Go-Funktion, die einen Strukturzeiger zurückgibt, nicht automatisch eine Schnittstelle?

Linda Hamilton
Linda HamiltonOriginal
2024-12-20 13:13:13281Durchsuche

Why Doesn't a Go Function Returning a Struct Pointer Automatically Implement an Interface?

Schnittstellenimplementierung in Go: Funktionstypen, die Strukturen zurückgeben

Bei der Arbeit mit Go kommt es häufig vor, dass eine Funktion eine Struktur zurückgibt das eine Schnittstelle implementiert. Es kann jedoch sein, dass beim Versuch, die Funktion einem Feld zuzuweisen, das eine Instanz der Schnittstelle erwartet, eine Fehlermeldung wie „[Funktion] kann nicht als Typ [Schnittstelle] im Feldwert verwendet werden“ angezeigt wird.

Um dies zu verstehen Fehler muss unbedingt klargestellt werden, dass eine Funktion, die einen Zeiger auf eine Struktur (Struktur) zurückgibt, nicht automatisch eine für diese Struktur definierte Schnittstelle implementiert. Mit anderen Worten: struct und struct sind unterschiedliche Typen in Go.

Im gegebenen Beispiel wird erwartet, dass die Funktion getInstance einen Wert vom Typ myInterface, bei dem es sich eher um eine Beschreibung des Verhaltens (Schnittstelle) als um eine bestimmte Implementierung (Struktur) handelt. getInstance gibt jedoch einen Zeiger auf die myStruct-Implementierung (*myStruct) zurück, die nicht typkompatibel mit myInterface ist.

Zu lösen Um dieses Problem zu lösen, müssen Sie

getInstance ändern, um eine Instanz von zurückzugeben myStruct-Struktur, wie im korrigierten Code unten zu sehen:

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{}
}
Diese Änderung stellt sicher, dass

myStruct die Schnittstelle myInterface implementiert und die Die Funktion getInstance gibt das Richtige zurück Typ.

Obwohl der obige Ansatz funktioniert, hat Go eine Sprachänderung vorgeschlagen, um eine Funktion, die einen konkreten Typ zurückgibt, automatisch in eine Funktion umzuwandeln, die eine Schnittstelle zurückgibt, wenn der konkrete Typ die Schnittstelle implementiert. Dieser Vorschlag wurde jedoch aufgrund möglicher Leistungs- und Sicherheitsbedenken abgelehnt.

Das obige ist der detaillierte Inhalt vonWarum implementiert eine Go-Funktion, die einen Strukturzeiger zurückgibt, nicht automatisch eine Schnittstelle?. 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