Maison >développement back-end >Golang >Comment puis-je implémenter l'égalité des clés personnalisée pour Go Maps ?

Comment puis-je implémenter l'égalité des clés personnalisée pour Go Maps ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-02 21:31:39917parcourir

How Can I Implement Custom Key Equality for Go Maps?

Égalité de clé personnalisée pour les cartes Go

Lors de la création d'une carte dans Go, vous pouvez utiliser n'importe quel type comme clé tant qu'il implémente l'interface comparable. Par défaut, Go utilise l'opérateur d'égalité intégré (==) pour comparer les clés. Cependant, il peut y avoir des cas où vous souhaitez définir vos propres critères d'égalité.

Exemple

Considérez le type de clé personnalisée suivant :

type Key struct {
    a *int
}

Pour comparer deux instances de Key, vous souhaitez utiliser votre propre Equal function :

func Equal(x Key, y Key) bool {
    return *x.a == *y.a
}

Solution de contournement

Malheureusement, Go ne vous permet pas de spécifier des fonctions de hachage ou d'égalité personnalisées pour les clés de carte. Au lieu de cela, vous pouvez utiliser la solution de contournement suivante :

  1. Dériver un attribut de clé : Au lieu d'utiliser la structure Key directement comme clé, dérivez un attribut (par exemple, un entier ou une chaîne) qui sert d’identité à la clé. Assurez-vous que les collisions ne se produisent que pour des clés sémantiquement identiques.
  2. Implémentez la fonction de hachage : Créez une méthode sur la clé qui calcule l'attribut dérivé et le renvoie sous forme d'entier (pour le hachage).
func (k *Key) HashKey() int {
    return *(*k).a
}

Exemple d'utilisation

Utilisation du Dans l'exemple ci-dessus, la carte serait :

k1, k2 := Key{intPtr(1)}, Key{intPtr(2)}
m := map[int]string{}
m[k1.HashKey()] = "one"
m[k2.HashKey()] = "two"

Précautions

Rappelez-vous que cette approche repose sur l'immuabilité de l'attribut clé dérivé. Si des champs de la structure Key changent, l'identité de la clé change et cela ne fonctionnera pas comme prévu.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn