ProgrammationDéveloppeur Go

Quels types de données en Go sont considérés comme comparables (comparable) et que se passe-t-il lorsqu'on essaie de comparer des types non comparables ? Comment cela affecte-t-il l'utilisation de map et set ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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 :

  • Tous les types numériques (int, float64, ...)
  • Les chaînes (string, rune)
  • Les pointeurs
  • Les canaux
  • Les interfaces, si leurs valeurs sont comparables
  • Les tableaux (array) et les structures, si tous leurs champs sont comparables

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.

Question piège

"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

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet


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é.