比较不区分大小写的字符串的常见做法是首先显式检查长度:
if len(a) == len(b) && strings.EqualFold(a, b) { ... }
字符串
这似乎是一种解决方法,因为current implementation只在用尽两个输入字符串中的任何一个时才进行长度检查。
有没有一个原因,为什么长度检查不做第一,性能方面或其他?
比较不区分大小写的字符串的常见做法是首先显式检查长度:
if len(a) == len(b) && strings.EqualFold(a, b) { ... }
字符串
这似乎是一种解决方法,因为current implementation只在用尽两个输入字符串中的任何一个时才进行长度检查。
有没有一个原因,为什么长度检查不做第一,性能方面或其他?
1条答案
按热度按时间r1zk6ea11#
简短的回答是,在Go语言中,两个字符串可能有不同的长度,但在简单的Unicode大小写折叠下仍然是相等的(所以首先进行长度比较并不能确定大小写折叠是否相等)。
更长的答案是:Go语言将字符串以UTF-8字节的形式存储在内存中,内置的
len()
函数报告UTF-8编码的字节数。UTF-8是一种可变长度的字符编码:它可以为单个Unicode码点使用不同的字节数,因此匹配的大小写折叠码点可以使用UTF-8中不同的字节数。请看一个例子来证明这一点:
字符串
这将输出(在Go Playground上尝试):
型