Maison  >  Article  >  développement back-end  >  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 ?

王林
王林avant
2024-02-13 21:03:08507parcourir

`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) { ... }

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))

Cela affichera (essayez-le sur Go Playground) :

ſ s
2 1 true

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer