web-dev-qa-db-fra.com

Est-il possible de définir l'égalité pour les types / structures nommés?

Après avoir lu une question connexe sur l'utilisation des tranches dans les cartes, je suis devenu curieux de savoir l'égalité dans Go.

Je sais qu'il est possible de remplacer la méthode equals d'un Java Object. Existe-t-il une manière similaire de définir comment Go vérifie l'égalité des types/structures définis par l'utilisateur ? Si oui, il y aurait une solution de contournement pour le problème référencé ci-dessus. Je pensais utiliser interface{} values pourrait offrir une solution mais j'ai reçu le message d'erreur panic: runtime error: hash of unhashable type []int.

33
Bill DeRose

Go prend en charge les structures de vérification d'égalité.

type Person struct {
    Name string
}

a := Person{"Bill DeRose"}
b := Person{"Bill DeRose"}

a == b // true

Cela ne fonctionnera pas avec les champs de pointeur (comme vous le souhaitez) car les adresses de pointeur sont différentes.

type Person struct {
    Friend *Person
}

a := Person{Friend: &Person{}}
b := Person{Friend: &Person{}}

a == b // false

Vous ne pouvez pas modifier l'opérateur d'égalité et il n'existe aucun moyen intégré d'ajouter la prise en charge des types personnalisés à utiliser == syntaxe. Au lieu de cela, vous devez comparer les valeurs du pointeur en utilisant reflect.DeepEqual .

import "reflect"

a := Person{Friend: &Person{}}
b := Person{Friend: &Person{}}

reflect.DeepEqual(a, b) // true

Gardez à l'esprit qu'il y a des mises en garde.

En général, DeepEqual est une relaxation récursive de l'opérateur == de Go. Cependant, cette idée est impossible à mettre en œuvre sans une certaine incohérence. Plus précisément, il est possible qu'une valeur soit inégale à elle-même, soit parce qu'elle est de type func (incomparable en général), soit parce qu'elle est une valeur NaN à virgule flottante (non égale à elle-même dans une comparaison à virgule flottante), ou parce que c'est un tableau, une structure ou une interface contenant une telle valeur.

19
AJcodez

Non, ce n'est pas définissable par l'utilisateur. Go a des règles strictes qui comptent comme égales, et même ce qui est comparable qui lui-même est basé sur l'attribution. Jetez un oeil à la section Opérateurs de comparaison de la spécification .

20
Volker