Restriction des touches de carte pour les types personnalisés
Certains types sont intrinsèquement inadaptés en tant que clés de carte, tels que les cartes, les tranches et les fonctions. Cependant, certains développeurs peuvent souhaiter empêcher explicitement qu'un type personnalisé spécifique soit utilisé comme clé de mappage.
Au départ, s'appuyer sur des membres privés au sein du type peut sembler une solution, mais cette approche est inefficace. Pour résoudre ce problème, nous avons besoin d'une solution plus fondamentale qui adhère à la spécification du langage.
La clé pour interdire l'utilisation d'un type comme clé de mappage réside dans la violation des exigences relatives aux opérateurs de comparaison. Selon la spécification, les types de clés de mappage doivent avoir des opérateurs de comparaison entièrement définis == et !=. Par conséquent, en incluant un champ avec un type non comparable, nous pouvons effectivement rendre le type entier non comparable.
Par exemple, considérons le type suivant :
type MyType struct { A *A b b notComparable []int }
Ajout du champ notComparable avec un type de tranche rend l'intégralité de MyType non comparable, empêchant son utilisation comme clé de mappage. En effet, les tranches ne peuvent pas être comparées.
m := map[MyType]int{} // Compile-time error: invalid map key type MyType
Il convient de noter que l'introduction d'un champ non comparable peut avoir d'autres implications. Par exemple, il sera impossible de comparer des valeurs du type à l'aide d'opérateurs comme == et !=. Cependant, en concevant soigneusement le type, il est possible de conserver la comparabilité pour des champs spécifiques tout en empêchant que le type soit 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!