提问人:z11i 提问时间:11/16/2023 最后编辑:iczaz11i 更新时间:11/16/2023 访问量:89
“字符串”有原因吗?EqualFold'不先做长度比较吗?
Is there a reason why `strings.EqualFold` does not do a length comparison first?
问:
比较不区分大小写的字符串的常见做法是首先显式检查长度:
if len(a) == len(b) && strings.EqualFold(a, b) { ... }
这似乎是一种解决方法,因为当前实现仅在耗尽两个输入字符串中的任何一个时才进行长度检查。
是否有原因不首先进行长度检查,无论是性能方面还是其他方面?
答:
6赞
icza
11/16/2023
#1
简短的回答是因为 2 个字符串在 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
评论