Maison > développement back-end > Golang > Y a-t-il une raison pour laquelle `strings.EqualFold` ne fait pas d'abord une comparaison de longueur ?

Y a-t-il une raison pour laquelle `strings.EqualFold` ne fait pas d'abord une comparaison de longueur ?

王林
Libérer: 2024-02-13 21:03:08
avant
624 Les gens l'ont consulté

`strings.EqualFold` 不首先进行长度比较是否有原因?

Éditeur PHP Apple, nous allons discuter aujourd'hui de la raison pour laquelle la fonction `strings.EqualFold` n'effectue pas de comparaison de longueur en premier lorsqu'elle compare si les chaînes sont égales. Dans la comparaison de chaînes, nous utilisons souvent la fonction « strings.EqualFold » pour ignorer la casse pour la comparaison. Cependant, certains peuvent se demander pourquoi cette fonction n'effectue pas d'abord une comparaison de longueur ? Dans l’article suivant, nous répondrons à cette question et discuterons de la justification de cette conception. Nous allons jeter un coup d'oeil!

Contenu de la question

Une pratique courante pour comparer des chaînes insensibles à la casse consiste à d'abord vérifier explicitement la longueur :

if len(a) == len(b) && strings.EqualFold(a, b) { ... }
Copier après la connexion

Cela semble être une solution de contournement, car l'implémentation actuelle ne vérifie la longueur que lorsque l'une des deux chaînes d'entrée est épuisée.

Y a-t-il une raison, de performance ou autre, de ne pas effectuer d'abord une vérification de longueur ?

Solution de contournement

La réponse courte est que dans Go, 2 chaînes peuvent avoir des longueurs différentes mais être toujours égales sous un simple pliage de casse Unicode (donc faire d'abord une comparaison de longueur ne détermine pas l'égalité de pliage de casse).

La réponse la plus longue est : Go stocke les chaînes en mémoire sous forme de UTF-8octets, et la fonction len() intégrée indique le nombre d'octets codés en UTF-8. UTF-8 est un codage de caractères de longueur variable : il peut utiliser un nombre d'octets différent pour un seul point de code Unicode, de sorte que les points de code correspondant à la casse peuvent utiliser un nombre d'octets différent dans UTF-8.

Regardez un exemple pour le prouver :

s1, s2 := "\u017F", "\u0073"
fmt.Println(s1, s2)

fmt.Println(len(s1), len(s2), strings.EqualFold(s1, s2))
Copier après la connexion

Cela affichera (essayez-le sur Go Playground) :

ſ s
2 1 true
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal