Pourquoi les instances génériques du même type ne peuvent-elles pas être attribuées les unes aux autres ?
Go interdit l'attribution d'instances de types génériques avec un type différent arguments les uns aux autres, même si les arguments de type remplissent des relations d’interface. Pour illustrer cela, considérons le code suivant :
type Generic interface { ID() string } type Props[G Generic] struct{} type Example struct { id string } func (example Example) ID() string { return example.id } var ExampleProps = Props[Example]{} func Problem() Props[Generic] { return ExampleProps }
L'exécution de ce code entraîne une erreur de compilation :
cannot use ExampleProps (variable of type Props[Example]) as Props[Generic] value in return statement
Cette erreur se produit car l'instanciation d'un type générique avec un nouvel argument de type crée un type distinct. Plus précisément :
Ces deux types ne sont pas interchangeable, malgré le fait qu'Example implémente Generic. Par conséquent, l'attribution de SampleProps (une instance de Props[Example]) à Props[Generic] n'est pas valide.
Ce comportement s'étend aux génériques instanciés avec any. any est simplement un type statique alias une interface vide : interface{}. Ce n'est pas équivalent à "any type" ou T. Ainsi, un type instancié avec any n'est pas attribuable à un type instancié avec un autre type spécifique.
Pour résoudre ce problème, vous pouvez instancier Props avec un paramètre de type , garantissant que les types d'entrée et de sortie de la fonction sont cohérents. Par exemple :
type Props[G Generic] struct{ Value G } func Problem[T Generic](v T) Props[T] { return Props[T]{ Value: v } } func main() { a := Problem(Example{}) fmt.Println(a) }
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!