Maison  >  Article  >  développement back-end  >  Pouvez-vous empêcher l’utilisation d’un type comme clé de carte dans Go ?

Pouvez-vous empêcher l’utilisation d’un type comme clé de carte dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-27 09:06:30956parcourir

 Can You Prevent a Type from Being Used as a Map Key in Go?

Empêcher l'utilisation d'un type comme clé de carte

Bien qu'il soit généralement avantageux d'avoir un type pouvant servir de clé de carte, dans certains cas , il peut être nécessaire d'en restreindre l'utilisation en tant que telle. Bien que supposer que la présence d'un membre privé dans un type l'empêcherait d'être utilisé comme clé de carte en dehors du package de définition est une idée fausse courante, en réalité, il n'offre pas une telle protection.

Meilleure approche pour empêcher l'utilisation des clés de mappage

Le moyen le plus efficace d'empêcher l'utilisation d'un type comme clé de mappage consiste à violer la spécification des types de mappage, qui exige que les types de clés permettent la définition de opérateurs de comparaison (== et != ). En incorporant un champ dans le type dont le type est jugé incomparable, comme une tranche ou une fonction, vous pouvez effectivement interdire son utilisation comme clé de mappage.

Considérez l'exemple suivant :

type MyType struct {
    S             string
    i             int
    notComparable []int
}

Une tentative d'utilisation de MyType comme clé de carte :

m := map[MyType]int{}

entraînera une erreur de compilation :

invalid map key type MyType

Conséquences de l'empêchement de l'utilisation de la clé de carte

Il est important de noter qu'en prenant cette mesure, vous perdrez la possibilité de comparer des valeurs de votre type à l'aide d'opérateurs de comparaison. Par exemple, le code suivant ne fonctionnera plus :

p1, p2 := MyType{}, MyType{}
fmt.Println(p1 == p2)

Erreur de compilation :

invalid operation: p1 == p2 (struct containing []int cannot be compared)

Préservation de la comparabilité

Si vous Si vous souhaitez préserver la comparabilité de votre type tout en empêchant son utilisation comme clé de mappage, vous pouvez utiliser une technique impliquant des types d'intégration et de wrapper. Par exemple :

type myType struct {
    S string
    i int
}

type MyType struct {
    myType
    notComparable []int
}

Grâce à cette approche, myType reste comparable, tandis que le type de wrapper exporté MyType ne peut pas être utilisé comme clé de mappage.

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