Comparaison des valeurs Go

Comparabilité par type

Les types de données de base sont toujours comparables en utilisant le==et!=les opérateurs:entiervaleurs,point flottantNombres,complexeNombres,booléenvaleurs,chaîne de caractèresvaleurs,constantvaleurs.

Déployerles valeurs sont comparables, si elles contiennent un type d'élément comparable

Aiguilleles valeurs sont comparables.

Canaliserles valeurs sont comparables.

Interfaceles valeurs sont comparables.

Comparantinterfacevalues ne fonctionne que si le type dynamique est comparable.

Fonctionvaleurs,Tranchevaleurs etCarteles valeurs sontne pascomparables, ils ne peuvent être comparés qu'ànil, comme cas particulier.

Les règles de comparaison

À partir de la spécification Go:

  • Booléenles valeurs sont comparables. Deux valeurs booléennes sont égales si elles sont les deuxtrueou les deuxfalse.

  • Entierles valeurs sont comparables et ordonnées, de la manière habituelle.

  • Point flottantles valeurs sont comparables et ordonnées, comme défini par leIEEE-754la norme.

  • Complexeles valeurs sont comparables. Deux valeurs complexes u et v sont égales si les deuxreal(u) == real(v)andimag (u) == imag (v) `.

  • Chaîne de caractèresles valeurs sont comparables et ordonnées, lexicalement octet.

  • Aiguilleles valeurs sont comparables. Deux valeurs de pointeur sont égales si elles pointent vers la même variable ou si les deux ont une valeurnil. Les pointeurs vers des variables de taille zéro distinctes peuvent être égaux ou non.

  • Canaliserles valeurs sont comparables. Deux valeurs de canal sont égales si elles ont été créées par le même appel à effectuer ou si les deux ont une valeurnil.

  • Interfaceles valeurs sont comparables. Deux valeurs d'interface sont égales si elles ont des types dynamiques identiques et des valeurs dynamiques égales ou si les deux ont une valeurnil.

  • Une valeur x denon-interfacetaperXet une valeurtdeinterfacetaperTsont comparables lorsque les valeurs de typeXsont comparables etXmet en oeuvreT. Ils sont égaux sitle type dynamique de est identique àXet la valeur dynamique de t est égale àx.

  • Structles valeurs sont comparables si tous leurs champs sont comparables. Deux valeurs de structure sont égales si leurs champs non vides correspondants sont égaux.

  • Déployerles valeurs sont comparables si les valeurs du type d'élément de tableau sont comparables. Deux valeurs de tableau sont égales si leurs éléments correspondants sont égaux.

Échec de la comparaison

Si la structure contient un champ dont le type n'est pas comparable, vous obtiendrez une erreur de compilation lors de la comparaison.

Comparaison de types incomparables: entrezrefect.DeepEqual()

LereflectLe paquet stdlib fournit lereflect.DeepEqual()fonction qui prend 2 types et renvoie un booléen:

func DeepEqual(x, y interface{}) bool

Les valeurs de types distincts ne sont jamais profondément égales, donc si vous passez 2 types différents, vous obtiendrez toujoursfalse.

Déployerles valeurs sont profondément égales lorsque leurs éléments correspondants sont profondément égaux.

Structles valeurs sont profondément égales si leurs champs correspondants sont profondément égaux.

Funcles valeurs sont profondément égales si les deux sontnil; sinon, ils ne sont pas profondément égaux.

Interfaceles valeurs sont profondément égales si elles contiennent des valeurs concrètes profondément égales.

Carteles valeurs sont profondément égales lorsque toutes les conditions suivantes sont vraies: - elles sont toutes les deuxnilou les deux nonnil- ils ont la même longueur - ils sont le même objet de carte ou leurs clés correspondantes (mises en correspondance avec l'égalité de Go) correspondent à des valeurs profondément égales.

Aiguilleles valeurs sont profondément égales si elles sont égales en utilisant les Go==opérateur ou s'ils pointent vers des valeurs profondément égales.

Trancheles valeurs sont profondément égales lorsque toutes les conditions suivantes sont vraies: - elles sont toutes les deuxnilou les deux nonnil- ils ont la même longueur, - ils pointent vers la même entrée initiale du même tableau sous-jacent (c'est-à-dire,&x[0] == &y[0]) ou leurs éléments correspondants (jusqu'à la longueur) sont profondément égaux.

Une tranche vide non nulle et unniltranche (par exemple,[]byte{}et[]byte(nil)) ne sont pas profondément égales.

Autres valeurs -Nombres,idiots,cordes, etcanaux- sont profondément égaux s'ils sont égaux en utilisant l'opérateur == de Go.

Quelques cas «spéciaux» inévitables qui méritent d'être mentionnés:il est possible qu'une valeur soit inégale par rapport à elle-même: - parce que c'est defunctype - parce que c'est une virgule flottanteNaNvaleur - parce que c'est undéployer,struct, ouinterfacecontenant une telle valeur

Les valeurs de pointeur sont toujours égales à elles-mêmes, même si elles pointent vers ou contiennent de telles valeurs problématiques, car elles se comparent égales à l'aide de Go==opérateur, et c'est une condition suffisante pour être profondément égal, quel que soit le contenu.

de même pourtranchesetPlans: sixetysont la même tranche ou la même carte, elles sont profondément égales quel que soit le contenu.


Plus de tutoriels go: