En Go, les variables peuvent être comparées entre elles à l'aide de l'opérateur == ou utilisées comme clé de map uniquement si leur type est comparable. Les types comparables incluent :
int, float64, ...)string, rune)Les slices, maps, fonctions — non comparables !
Tenter de comparer de telles valeurs entraîne une erreur de compilation. Par exemple :
var a = []int{1,2,3} var b = []int{1,2,3} printf("%v", a==b) // erreur de compilation : le slice ne peut être comparé qu'à nil
Pour utiliser une valeur comme clé dans une map, elle doit absolument être comparable. Si le type ne correspond pas — erreur de compilation.
"Deux structures peuvent-elles être considérées comme comparables si seulement une partie de leurs champs ne l'est pas ?"
Beaucoup répondent "oui", mais c'est faux. Si au moins un champ d'une structure est non comparable (par exemple, un slice ou une map), toute la structure devient non comparable.
Exemple :
type T struct { A int S []string } var t1, t2 T t1 == t2 // erreur de compilation : les slices ne sont pas comparables
Histoire
Un développeur a essayé d'utiliser un slice comme clé de map pour mettre en cache les résultats des calculs, ce qui a entraîné une erreur de compilation. Il a été remplacé par une chaîne avec un sérialiseur explicite — le problème a été résolu.
Histoire
Lors de l'ajout d'un nouveau champ (de type slice) dans une structure utilisée comme clé de dictionnaire, le projet a soudainement cessé de se compiler. La raison : maintenant, la structure est devenue non comparable, mais personne ne s'attendait à ce que cela se propage à l'intérieur des structures imbriquées.
Histoire
Pour créer un ensemble (set) avec des structures contenant des slices, ils ont essayé d'utiliser une map. Ne comprenant pas les règles de comparaison, ils ont rencontré de nombreuses erreurs à l'exécution en essayant de comparer les éléments, mais la raison était l'impossibilité de les compiler avec une telle clé.