Ich möchte eine Schnittstelle, die Parameter jedes Typs an ihre einzelne Methode übergeben kann, und ich möchte eine einzelne Implementierungsstruktur mit Generika.
Dies ist eine stark vereinfachte Version meines Problems:
package main type MyInterface interface { Set(val any) } type MyStruct[T any] struct { val T } func NewMyStruct[T any]() *MyStruct[T] { return &MyStruct[T]{} } func (s *MyStruct[T]) Set(val T) { s.val = val } func main() { var obj MyInterface obj = NewMyStruct[any]() // accepted obj = NewMyStruct[int]() // not accepted obj = NewMyStruct[string]() // not accepted }
Gibt es eine Möglichkeit, die Anforderungen des Compilers zu erfüllen, ohne die Typinformationen der Set-Methode zu verlieren, wenn direkt mit der Struktur gearbeitet wird?
Ich denke, Ihr Code kann so geändert werden
package main import "fmt" type MyInterface[T any] interface { Set(value T) } type MyStruct[T any] struct { val T } func NewMyStruct[T any]() *MyStruct[T] { return &MyStruct[T]{} } func (s *MyStruct[T]) Set(val T) { s.val = val } func main() { var obj1 MyInterface[int] obj1 = NewMyStruct[int]() var obj2 MyInterface[string] obj2 = NewMyStruct[string]() var obj3 MyInterface[any] obj3 = NewMyStruct[any]() }
Wenn Sie einen parametrisierten Typ verwenden, müssen Sie die Typparameter in seiner Definition durch den tatsächlichen Typ ersetzen. Das bedeutet, dass der generische Typ in der Schnittstelle instanziiert werden muss. Dazu sollte Ihre Schnittstelle so deklariert sein.
// As-is type MyInterface interface { Set(val any) } // To-be type MyInterface[T any] interface { Set(val T) }
Und wenn Sie es verwenden, sollten Sie sich darüber im Klaren sein, welchen Typ any
Sie verwenden.
func main() { var obj1 MyInterface[int] obj1 = NewMyStruct[int]() }
Ich habe zwei Seiten zitiert
[1] Go-Fehler: Generische, nicht instanziierte Typen können nicht verwendet werden
[2] Wie implementiert man eine universelle Schnittstelle?
Das obige ist der detaillierte Inhalt vonImplementierung von Schnittstellenmethoden mithilfe generischer Typstrukturen in Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!