Go Generics : contraintes de type pour les clés de carte
Question :
Pourquoi les éléments suivants le code ne parvient pas à se compiler lors de l'utilisation d'une liste chaînée générique comme carte clé ?
type List[X any] interface { isList() } type Cons[X any] struct { Data X Next List[X] } func (Cons[X]) isList() {} func main() { x := Cons[int]{5, Nil[int]{}} m := map[List[int]]string{} m[x] = "Hi" fmt.Println(m[x]) fmt.Println(id(x)) }
Réponse :
Dans Go 1.18 et 1.19, la contrainte comparable prédéfinie est requise pour les clés de carte et limite son utilisation à des types strictement comparables qui prend en charge les comparaisons == et != sans paniquer au moment de l'exécution. Les interfaces, même si elles prennent en charge les comparaisons d'égalité, n'implémentent pas de comparable car elles ont un ensemble de types infini.
Bien que l'interface List[X] elle-même puisse être utilisée comme clé de mappage, la structure Cons[X] le fait n'implémente pas comparable car il contient un champ List[X]. Il n'existe pas de contrainte plus faible pouvant être utilisée pour identifier les types pouvant être utilisés comme clés de carte.
Cependant, dans Go 1.20 (février 2023), ce comportement a été corrigé. comparable accepte désormais tous les types comparables selon la spécification du langage, même s'ils peuvent paniquer au moment de l'exécution à cause de la comparaison. Cela permet au code de se compiler avec succès.
Contrainte alternative :
S'il est nécessaire d'utiliser une contrainte qui inclut la méthode isList(), vous pouvez définir la vôtre contrainte comme suit :
type List interface { comparable isList() bool }
Ensuite, demandez à vos structures de clé de carte d'implémenter cette interface List au lieu de déclarer une interface 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!