Frage:
In Go habe ich eine Struktur in einer Paket, das eine Schnittstelle implementiert. In einem anderen abhängigen Paket möchte ich zu Testzwecken eine gefälschte Implementierung dieser Struktur erstellen. Allerdings beschwert sich Go über die Typsicherheit, wenn ich versuche, eine Funktion, die eine Struktur zurückgibt, die die Schnittstelle implementiert, einer Variablen dieser Schnittstelle zuzuweisen.
Architektur:
// Package expensive type myStruct struct{} func (m *myStruct) DoSomething() {...} func (m *myStruct) DoSomethingElse() {...} func CreateInstance() *myStruct {...} // Expensive to call // Package main type myInterface interface { DoSomething() } type structToConstruct struct { factoryFunction func() myInterface } func (s *structToConstruct) performAction() {...}
Fehler:
"kosteure.CreateInstance (Typ func()) kann nicht verwendet werden *expensive.myStruct) als Typ func() myInterface im Feldwert"
Antwort:
Das Problem tritt auf, weil die CreateInstance-Funktion einen *myStruct-Wert zurückgibt, der unterschiedlich ist vom Typ func() myInterface, der von der FactoryFunction benötigt wird. Um dieses Problem zu beheben:
// Package main type myInterface interface { DoSomething() } type myStruct struct{} func (m *myStruct) DoSomething() {...} func getInstance() myInterface { return &myStruct{} }
Mit dieser Änderung gibt getInstance jetzt einen myInterface-Typ zurück, der die Zuweisung zu „factoryFunction“ ermöglicht.
Zusätzliche Hinweise:
wrapper := func() myInterface { return expensive.CreateInstance() }
Das obige ist der detaillierte Inhalt vonWie weist man eine Funktion zu, die eine Struktur zurückgibt und eine Schnittstelle in Go implementiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!