In Go erlauben generische Schnittstellen und Implementierungen keine direkte Zuweisung über verschiedene Typargumente hinweg.
Lassen Sie uns darüber nachdenken ein vereinfachtes Beispiel:
// Abstract type Generic interface { ID() string } type Props[G Generic] struct{} // Example type Example struct { id string } func (example Example) ID() string { return example.id } var ExampleProps = Props[Example]{} // Problem func Problem() Props[Generic] { return ExampleProps }
Dieser Code löst einen Kompilierungsfehler aus, der dies angibt Props[Example] kann in der Return-Anweisung nicht Props[Generic] zugewiesen werden. Dies liegt daran, dass Go bei der Instanziierung generischer Typen mit unterschiedlichen Typargumenten unterschiedliche benannte Typen erstellt.
Betrachten Sie die folgende Funktion:
func Problem() Props[Generic] { return ExampleProps }
Sie instanziiert Props mit Generic als Typargument. Folglich werden Props[Example] und Props[Generic] zu zwei unterschiedlichen Typen, obwohl „Example“ „Generic“ implementiert. Daher ist die Zuweisung von Props[Example] zu Props[Generic] ungültig, unabhängig von ihren Typparametern.
Um dieses Problem zu beheben, besteht eine Möglichkeit darin, Props mit einem Typparameter zu instanziieren, der die Generic-Einschränkung erfüllt:
// adding a field to make this a bit less contrived type Props[G Generic] struct{ Value G } // Props instantiated with T, adequately constrained func Problem[T Generic](v T) Props[T] { return Props[T]{ Value: v } } func main() { a := Problem(Example{}) fmt.Println(a) }
In diesem Beispiel wird Props mit einem Typparameter T instanziiert, der der generischen Schnittstelle entspricht. Dies ermöglicht die Zuweisung von Werten vom Typ Props[Example] zu Props[Generic] und gewährleistet die Typsicherheit.
Das obige ist der detaillierte Inhalt vonWarum kann ich keine generischen Go-Typen mit unterschiedlichen Argumenten zuweisen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!