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
Patricia Arquetteoriginal
2024-12-28 10:21:10662parcourir

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
}

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
}

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

func (f *foo[float64]) setValToPi() {
    // ...
}

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
}

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!

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