Maison >développement back-end >Golang >Pourquoi ne puis-je pas attribuer « Props[Example] » à « Props[Generic] » dans Go Generics ?

Pourquoi ne puis-je pas attribuer « Props[Example] » à « Props[Generic] » dans Go Generics ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-20 09:15:11445parcourir

Why Can't I Assign `Props[Example]` to `Props[Generic]` in Go Generics?

Restrictions génériques d'attribution de type

Considérez 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
}

Ce code ne parvient pas à se compiler avec l'erreur :

cannot use ExampleProps (variable of type Props[Example]) as Props[Generic] value in return statement

Pourquoi est-ce se produit ?

Go Generics crée des types nommés entièrement nouveaux lorsqu'ils sont instanciés avec différents arguments de type. Dans ce cas, Props[Example] et Props[Generic] sont des types nommés distincts, même si l'exemple implémente Generic.

Flexibilité grâce au paramétrage des types

Pour résoudre ce problème et maintenir la flexibilité, on peut instancier Props avec un paramètre de type :

func Problem[T Generic](v T) Props[T] {
    return Props[T]{Value: v}
}

Cette approche permet à la fonction de renvoyer Props[T] pour un type générique T spécifique qui implémente Generic.

Résumé

Dans les génériques Go, l'instanciation d'un type générique avec différents arguments de type entraîne des types nommés distincts . Par conséquent, tenter d’attribuer un type à un autre, même si leurs arguments de type satisfont à des conditions spécifiques, n’est pas autorisé. L'utilisation du paramétrage de type offre une solution pour maintenir la flexibilité dans de tels scénarios.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn