Je veux une interface qui peut transmettre des paramètres de n'importe quel type à sa méthode unique, et je veux une structure d'implémentation unique avec des génériques.
Voici une version super simplifiée de mon problème :
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 }
Existe-t-il un moyen de satisfaire les exigences du compilateur sans perdre les informations de type de la méthode Set lorsque l'on traite directement la structure ?
Je pense que votre code peut être modifié comme ça
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]() }
Chaque fois que vous utilisez un type paramétré, vous devez remplacer les paramètres de type dans sa définition par le type réel. Cela signifie que le type générique dans l'interface doit être instancié. Pour cela, votre interface doit être déclarée ainsi.
// As-is type MyInterface interface { Set(val any) } // To-be type MyInterface[T any] interface { Set(val T) }
Et lorsque vous l'utilisez, vous devez savoir clairement quel type any
vous utilisez.
func main() { var obj1 MyInterface[int] obj1 = NewMyStruct[int]() }
J'ai cité deux pages
[1] Erreur Go : impossible d'utiliser des types génériques non instanciés
[2] Comment implémenter une interface universelle ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!