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 deux
true
ou 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 deux
real(u) == real(v)
and
imag (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 valeur
nil
. 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 valeur
nil
.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 valeur
nil
.Une valeur x denon-interfacetaper
X
et une valeurt
deinterfacetaperT
sont comparables lorsque les valeurs de typeX
sont comparables etX
met en oeuvreT
. Ils sont égaux sit
le type dynamique de est identique àX
et 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()
Lereflect
Le 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 deuxnil
ou 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 deuxnil
ou 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 unnil
tranche (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 defunc
type - parce que c'est une virgule flottanteNaN
valeur - 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: six
ety
sont la même tranche ou la même carte, elles sont profondément égales quel que soit le contenu.
Plus de tutoriels go:
- Utilisation du proxy inverse NGINX pour servir les services Go
- Faire une copie d'une structure dans Go
- Les bases d'un serveur Web Go
- Trier un type de carte dans Go
- Allez les pointeurs en un mot
- Go Tags expliqué
- Aller au formatage de la date et de l'heure
- Traitement JSON avec Go
- Fonctions Go Variadic
- Fiche de triche Go Strings
- L'interface Go Empty expliquée
- Débogage Go avec VS Code et Delve
- Named Go renvoie des paramètres
- Générer des nombres et des chaînes aléatoires dans Go
- Structure du système de fichiers d'un projet Go
- Algorithme de recherche binaire implémenté dans Go
- Utilisation des indicateurs de ligne de commande dans Go
- GOPATH a expliqué
- Créez une application de ligne de commande avec Go: lolcat
- Création d'une commande CLI avec Go: cowsay
- Utilisation de Shell Pipes avec Go
- Tutoriel Go CLI: Clone de fortune
- Lister les fichiers dans un dossier avec Go
- Utilisez Go pour obtenir une liste des référentiels à partir de GitHub
- Allez, ajoutez une tranche de chaînes à un fichier
- Allez, convertissez une chaîne en une tranche d'octets
- Visualisez vos contributions Git locales avec Go
- Premiers pas avec Go CPU et profilage de la mémoire
- Résolution de l'erreur "ne prend pas en charge l'indexation" dans un programme Go
- Mesure du temps d'exécution dans un programme Go
- Création d'un robot d'exploration Web avec Go pour détecter les titres en double
- Go Best Practices: pointeur ou récepteurs de valeur?
- Go Best Practices: Devez-vous utiliser une méthode ou une fonction?
- Go Structures de données: définir
- Aide-mémoire Go Maps
- Générer des implémentations pour les types génériques dans Go
- Go Data Structures: Dictionnaire
- Structures de données Go: table de hachage
- Implémenter des écouteurs d'événements dans Passer par les canaux
- Go Structures de données: pile
- Go Structures de données: file d'attente
- Go Structures de données: arbre de recherche binaire
- Go Structures de données: graphique
- Structures de données Go: liste liée
- Le guide complet des structures de données Go
- Comparaison des valeurs Go
- Est-ce que Go est orienté objet?
- Travailler avec une base de données SQL dans Go
- Utilisation des variables d'environnement dans Go
- Tutoriel Go: API REST soutenue par PostgreSQL
- Activation de CORS sur un serveur Web Go
- Déployer une application Go dans un conteneur Docker
- Pourquoi Go est un langage puissant à apprendre en tant que développeur PHP
- Allez, supprimez le caractère de nouvelle ligne io.Reader.ReadString
- Allez, comment observer les changements et reconstruire votre programme
- Allez, comptez les mois depuis une date
- Accéder aux paramètres HTTP POST dans Go