Maison > développement back-end > Golang > Pourquoi les types génériques de Go avec des arguments de type différents ne peuvent-ils pas être attribués les uns aux autres ?

Pourquoi les types génériques de Go avec des arguments de type différents ne peuvent-ils pas être attribués les uns aux autres ?

Linda Hamilton
Libérer: 2024-12-19 11:22:09
original
622 Les gens l'ont consulté

Why Can't Go's Generic Types with Different Type Arguments Be Assigned to Each Other?

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
}
Copier après la connexion

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
Copier après la connexion

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 :

  • Props[Example] est un type nommé, et
  • Props[Generic] est un autre type nommé.

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)
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal