Heim >Backend-Entwicklung >Golang >Warum erfüllt eine Go-Funktion, die eine Struktur zurückgibt, die eine Schnittstelle implementiert, nicht ein Funktionsfeld, das eine Schnittstelle zurückgibt?
Go-Funktionstypen, die Strukturen zurückgeben, die mit Schnittstellen nicht kompatibel sind
Frage:
In Go, warum Erfüllt eine Funktion, die eine Struktur zurückgibt, die eine Schnittstelle implementiert, nicht die Typanforderung eines Felds, das eine Funktion erwartet, die diese zurückgibt? Schnittstelle?
Antwort:
Das Problem liegt darin, dass ein Go-Funktionstyp, der eine Struktur zurückgibt, nicht einmal mit einem Funktionstyp austauschbar ist, der eine Schnittstelle zurückgibt wenn die Struktur die Schnittstelle implementiert. Beim Deklarieren einer Typsignatur für eine Funktion innerhalb einer Struktur muss der spezifische Rückgabetyp mit dem deklarierten Typ übereinstimmen. Durch Ändern der Factory-Funktion, um den Schnittstellentyp direkt zurückzugeben, wird das Problem behoben.
Beispiel:
package main import "fmt" func main() { thing := structToConstruct{getInstance} thing.performAction() } type myInterface interface { doSomething() } type structToConstruct struct { factoryFunction func() myInterface } func (s *structToConstruct) performAction() { instance := s.factoryFunction() instance.doSomething() } func getInstance() myInterface { return &myStruct{} } type myStruct struct{} func (m *myStruct) doSomething() { fmt.Println("doing something") }
In diesem Beispiel wird die Factory-Funktion so geändert, dass sie eine Instanz zurückgibt von myInterface, das die Typanforderung für erfüllt structToConstruct.
Erklärung:
Bei der Deklaration des Typs structToConstruct geben wir an, dass es sich bei „factoryFunction“ um eine Funktion handeln soll, die ein „myInterface“ zurückgibt. Die Funktion „costure.CreateInstance“ gibt jedoch einen *myStruct-Wert zurück, der myInterface nicht direkt zugewiesen werden kann. Dies liegt daran, dass Go-Schnittstellen Typsicherheit bieten und eine Funktion, die einen bestimmten Strukturtyp (z. B. *myStruct) zurückgibt, nicht automatisch in eine Funktion konvertiert werden kann, die den von ihr implementierten Schnittstellentyp zurückgibt.
Zur Verwendung von *myStruct Wenn wir einen Wert mit myInterface angeben, müssen wir ihn explizit mithilfe der Typzusicherung oder durch Erstellen einer Adapterfunktion konvertieren, die die Konvertierung umschließt:
func wrapper() myInterface { return expensive.CreateInstance() } thing := structToConstruct{wrapper}
Das obige ist der detaillierte Inhalt vonWarum erfüllt eine Go-Funktion, die eine Struktur zurückgibt, die eine Schnittstelle implementiert, nicht ein Funktionsfeld, das eine Schnittstelle zurückgibt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!