Go中不区分大小写的字符串比较的方法

1,652 阅读1分钟

Go中是否有不区分大小写的字符串比较功能?当然有!尽管这个名字似乎并没有表明这一点。 strings.EqualFold处理它。

package main
import (
"fmt"
"strings"
)
func main() {
foo1 := "foo"
foo2 := "FOO"
fmt.Println(strings.EqualFold(foo1, foo2))
}

你现在可能会问,为什么我们不能把两个字符串都转换为大写或小写,并通过这种方式来比较它们是否大小写相等。当然,这也是可行的,但不是对任何情况和任何语言都适用。例如,在希腊语中,有三种形式的西格玛字母。

g1 := "ς" // a final lowercase sigma
g2 := "Σ" // a capital sigma
g3 := "σ" // a non-final sigma
fmt.Println(strings.ToLower(g1))
fmt.Println(strings.ToLower(g2))
fmt.Println(strings.ToLower(g3))
fmt.Println(strings.EqualFold(g1, g2))
fmt.Println(strings.EqualFold(g1, g3))
fmt.Println(strings.EqualFold(g2, g3))

输出

ς
σ
σ
true
true
true

将它们转换为小写并不能得到相同的形式,但使用 strings.EqualFold进行比较,就会发现它们是相等的。这是因为 strings.EqualFold使用了大小写折叠(现在明白了为什么这个函数被命名为EqualFold )的方法,它尊重不同语言的大小写规则,所以它总是应该是不区分大小写的首选比较方法。