strings.EqualFold 是 Go 标准库中基于 Unicode 大小写折叠规则实现的不区分大小写字符串比较函数,适用于 HTTP Header 校验、用户输入验证、API 路由匹配等国际化场景,不适用于需 Unicode 归一化或 locale-aware 的比较。

strings.EqualFold 是什么,适合哪些场景
strings.EqualFold 是 Go 标准库中用于忽略大小写比较字符串的函数,它基于 Unicode 大小写折叠规则(case folding),比简单转成全大写或全小写更准确。适用于需要国际化支持的场景,比如 HTTP header 名称校验、用户输入的邮箱域名比对、API 路由匹配等。
它不适用于:
- 纯 ASCII 字符串且你只关心英文字母(这时
strings.ToLower(a) == strings.ToLower(b)更快) - 需要 locale-aware 比较(Go 不支持 locale,
EqualFold是 Unicode-aware,不是 locale-aware) - 比较前需做规范化(如 NFC/NFD)——
EqualFold不处理 Unicode 归一化,若输入含组合字符(如é写作e\u0301),可能返回 false
直接调用 EqualFold 的正确方式
调用非常简单,传入两个 string 即可,返回 bool:
import "strings"
<p>result := strings.EqualFold("Hello", "HELLO") // true
result := strings.EqualFold("Straße", "STRASSE") // true(德语 ß 折叠为 ss)
result := strings.EqualFold("αβγ", "ΑΒΓ") // true(希腊字母大小写)
注意:
- 两个参数都必须是
string类型;不能传[]byte,否则编译报错:cannot use [...] as string - 空字符串和 nil 字符串不会 panic,
strings.EqualFold("", "")返回true,strings.EqualFold("", "a")返回false - 性能上比
ToLower略优(避免分配新字符串),但差别在纳秒级,日常使用无需过度优化
常见错误:把 EqualFold 当作 ToLower + == 用
有人会误以为 EqualFold 等价于 “先转小写再比较”,于是写出这类逻辑:
// ❌ 错误示范:试图手动模拟 EqualFold 行为
if strings.ToLower(a) == strings.ToLower(b) { ... }
这在多数英文场景下看似可行,但会出问题:
-
"ß"和"SS":前者ToLower("SS") == "ss",后者ToLower("ß") == "ß",所以ToLower比较返回false,而EqualFold("ß", "SS")返回true - 某些土耳其语字符(如
"I"和"ı"):标准ToLower在非 Turkic locale 下行为不一致,而EqualFold始终按 Unicode 规范处理 - 多次分配内存:每次调用
ToLower都新建字符串,EqualFold是零分配(只要底层字符串不逃逸)
和 bytes.EqualFold 的区别与选择
Go 还提供了 bytes.EqualFold,它接受两个 []byte,语义和 strings.EqualFold 完全一致,只是输入类型不同。
选哪个取决于你的数据来源:
- 如果已有
string变量(比如函数参数、结构体字段),直接用strings.EqualFold,避免转成[]byte的额外开销 - 如果数据来自
io.Reader、网络 buffer 或已存为[]byte(比如 HTTP body 解析结果),用bytes.EqualFold更自然,避免string(b)转换带来的潜在内存拷贝(虽然小字符串会逃逸优化,但大 buffer 明显)
data := []byte("Content-Type")
if bytes.EqualFold(data, []byte("content-type")) { ... } // ✅ 直接比 byte slice
Unicode 大小写折叠本身不区分 string/[]byte,两者底层共享同一套逻辑,结果完全一致。
实际用的时候,最容易被忽略的是:它不处理 Unicode 归一化。如果业务里真遇到带组合标记的字符串(比如用户从某些富文本编辑器粘贴来的“café”),得先用 golang.org/x/text/unicode/norm Normalize,再用 EqualFold —— 否则比较可能失败。

















