Go语言 为什么`strings. fold`不先进行长度比较?

wz1wpwve  于 5个月前  发布在  Go
关注(0)|答案(1)|浏览(67)

比较不区分大小写的字符串的常见做法是首先显式检查长度:

if len(a) == len(b) && strings.EqualFold(a, b) { ... }

字符串
这似乎是一种解决方法,因为current implementation只在用尽两个输入字符串中的任何一个时才进行长度检查。
有没有一个原因,为什么长度检查不做第一,性能方面或其他?

r1zk6ea1

r1zk6ea11#

简短的回答是,在Go语言中,两个字符串可能有不同的长度,但在简单的Unicode大小写折叠下仍然是相等的(所以首先进行长度比较并不能确定大小写折叠是否相等)。
更长的答案是:Go语言将字符串以UTF-8字节的形式存储在内存中,内置的len()函数报告UTF-8编码的字节数。UTF-8是一种可变长度的字符编码:它可以为单个Unicode码点使用不同的字节数,因此匹配的大小写折叠码点可以使用UTF-8中不同的字节数。
请看一个例子来证明这一点:

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

fmt.Println(len(s1), len(s2), strings.EqualFold(s1, s2))

字符串
这将输出(在Go Playground上尝试):

ſ s
2 1 true

相关问题