Dans Go, les interfaces et implémentations génériques ne permettent pas l'affectation directe entre différents arguments de type.
Considérons un exemple simplifié :
// 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 }
Ce code génère une erreur de compilation indiquant que Props[Exemple] ne peut pas être affecté à Props[Generic] dans l'instruction return. En effet, lors de l'instanciation de types génériques avec différents arguments de type, Go crée des types nommés distincts.
Considérez la fonction suivante :
func Problem() Props[Generic] { return ExampleProps }
Elle instancie Props avec Generic comme argument de type. Par conséquent, Props[Example] et Props[Generic] deviennent deux types différents, même si Exemple implémente Generic. Par conséquent, l'attribution de Props[Example] à Props[Generic] n'est pas valide, quels que soient leurs paramètres de type.
Pour résoudre ce problème, une option consiste à instancier Props avec un paramètre de type qui satisfait la contrainte Generic :
// 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) }
Dans cet exemple, Props est instancié avec un paramètre de type T conforme à l'interface générique. Cela permet d'attribuer des valeurs de type Props[Example] à Props[Generic] et garantit la sécurité du type.
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!