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 SiegetInstance ä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{} }
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!