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

Comment puis-je implémenter l'égalité personnalisée pour les clés de carte dans Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-08 14:32:17333parcourir

How Can I Implement Custom Equality for Map Keys in Go?

Clés de carte personnalisées avec égalité définie par l'utilisateur dans Go

Dans Go, les cartes utilisent une sémantique comparable stricte pour les clés de carte. Cela signifie que les programmeurs ne peuvent pas implémenter leurs propres fonctions de hachage et opérations d'égalité pour les clés de mappage comme ils le font dans d'autres langages.

Pour remédier à cette limitation, envisagez une approche alternative. Au lieu d'utiliser directement les instances de structure comme clés, utilisez un attribut dérivé de la structure qui sert de clé de mappage appropriée et adhère à la sémantique d'égalité souhaitée. Dans de nombreux cas, il est possible de dériver une valeur entière ou une chaîne sous forme de code de hachage représentant l'identité d'une instance.

Il est crucial de garantir que les collisions dans le code de hachage dérivé ne se produisent que lorsqu'elles indiquent une véritable identité sémantique de la valeur stockée. Cela signifie que les valeurs correspondantes doivent être interchangeables.

Par exemple :

type Key struct {
  a *int
}

func (k *Key) HashKey() int {
  return *(*k).a
}

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

Cependant, soyez conscient des problèmes d'immuabilité lorsque vous utilisez cette approche. Si vous modifiez le champ a dans l'exemple ci-dessus, l'instance ne peut plus servir de clé de hachage car son identité a changé.

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