Go-Funktionstypen, die Strukturen innerhalb von Schnittstellen zurückgeben
In Go werden häufig Schnittstellen verwendet, um das Verhalten von Strukturen zu definieren. Wenn Sie jedoch mit Funktionen arbeiten, die Strukturen zurückgeben, die Schnittstellen implementieren, können Typsicherheitsfehler auftreten.
Verstehen des Problems
Sehen wir uns das von Ihnen bereitgestellte Codebeispiel an:
package expensive type myStruct struct { ... } // Struct with time-consuming methods func CreateInstance() *myStruct { ... } // Expensive factory function
package main import "expensive" type myInterface interface { DoSomething() } type structToConstruct struct { factoryFunction func() myInterface } func (s *structToConstruct) performAction() { instance := s.factoryFunction(); instance.DoSomething() }
Hier haben Sie eine Factory-Funktion CreateInstance definiert, die eine *myStruct zurückgibt. Anschließend haben Sie eine Schnittstelle „myInterface“ erstellt, die *myStruct implementiert. Sie haben jedoch die Factory-Funktion einem Feld in structToConstruct zugewiesen, das eine Funktion erwartet, die myInterface zurückgibt, was den Kompilierungsfehler verursacht.
Problem lösen
Um dieses Problem zu beheben, müssen Sie haben zwei Optionen:
wrapper := func() myInterface { return expensive.CreateInstance() } thing := structToConstruct{wrapper}
func CreateInstance() myInterface { return &myStruct{} }
Warum Option 1 funktioniert
In Option 1 ist die Die Wrapper-Funktion konvertiert das Ergebnis von CreateInstance in myInterface, bevor sie es der FactoryFunction zuweist. Dies erfüllt die Typsignatur von structToConstruct, da die Wrapper-Funktion mit dem erwarteten Funktionstyp übereinstimmt.
Warum Option 2 Vorschlag 12754 erfordert
In Option 2, wenn Sie es direkt versuchen Wenn Sie CreateInstance der FactoryFunction zuweisen, wird sich Go beschweren, da CreateInstance einen strukturierten Zeiger und keine Schnittstelle zurückgibt. Vorschlag 12754 schlägt vor, die Sprache zu erweitern, um solche Aufgaben zu unterstützen, wurde jedoch letztendlich abgelehnt.
Das obige ist der detaillierte Inhalt vonWie kann ich mit Go-Funktionen umgehen, die Strukturen zurückgeben, die Schnittstellen implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!