Maison > développement back-end > Golang > Comment éviter les erreurs IncompatibleAssign lors de l'utilisation de contraintes de types mixtes dans Go Generics ?

Comment éviter les erreurs IncompatibleAssign lors de l'utilisation de contraintes de types mixtes dans Go Generics ?

Patricia Arquette
Libérer: 2024-12-28 10:21:10
original
666 Les gens l'ont consulté

How to Avoid IncompatibleAssign Errors When Using Mixed Type Constraints in Go Generics?

Gestion des IncompatibleAssignErrors dans les types génériques avec des contraintes de valeurs mixtes

Dans Go, les génériques permettent la création de types avec des contraintes spécifiques sur leurs champs. Cependant, l'attribution de littéraux de valeur aux champs de structure peut entraîner des erreurs IncompatibleAssign lors du mélange de différents groupes de types dans les contraintes.

Considérez cet exemple :

type constraint interface {
    ~float32 | ~float64
}

type foo[T constraint] struct {
    val T
}

func (f *foo[float64]) setValToPi() {
    f.val = 3.14
}
Copier après la connexion

Ce code attribue le littéral 3.14 au val champ de type foo[float64]. Ceci est acceptable car 3.14 est une valeur float64 valide.

Cependant, l'erreur se produit lorsque la contrainte est étendue pour inclure les types int :

type constraint interface {
    ~float32 | ~float64 | ~int
}

type foo[T constraint] struct {
    val T
}

func (f *foo[float64]) setValToPi() {
    f.val = 3.14 // IncompatibleAssign: cannot use 3.14 (untyped float constant) as float64 value in assignment
}
Copier après la connexion

Cette erreur provient de la déclaration de méthode :

func (f *foo[float64]) setValToPi() {
    // ...
}
Copier après la connexion

Ici, float64 est traité comme un nom de paramètre de type plutôt que comme une contrainte prévue. Par conséquent, le compilateur ne peut pas déterminer le type spécifique du champ val et ne peut pas vérifier que 3.14 est compatible avec toutes les instances de contrainte possibles.

Pour résoudre ce problème, il est essentiel d'utiliser un paramètre de méthode générique pour accepter une valeur de le paramètre type type à la place :

func (f *foo[T]) SetValue(val T) {
    f.val = val
}
Copier après la connexion

Cette solution empêche d'attribuer des valeurs fixes comme 3.14, ce qui est une pratique inappropriée dans ce contexte. Des approches alternatives impliquent d'utiliser any/interface{} comme type de champ.

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