strings.Contains是Go中判断子串存在的最快最安全方式,仅返回bool、区分大小写、不支持正则;需位置用Index,忽略大小写需手动转小写或EqualFold,空串恒为true。

strings.Contains 是 Go 标准库中最快、最安全的子串判断方式,不需要正则、不区分大小写、不返回位置——它只回答“有没有”。如果你要的是“是否存在某段文本”,直接用它;如果要找位置、要忽略大小写、要匹配模式,它就不够用了。
什么时候该用 strings.Contains 而不是 strings.Index
两者都查子串,但语义和性能不同:
-
strings.Contains返回bool,语义清晰:你只关心“在不在”,不关心“在哪” -
strings.Index返回int(位置)或-1,多一次整数比较才能转成 bool,有轻微开销 - 底层实现上,
Contains在找到第一个匹配后就立即返回true,而Index也一样——但前者少一次类型转换和条件判断 - 如果后续还要用位置(比如切片、替换),才值得用
Index;否则纯判断存在性,Contains更直白、更不易出错
strings.Contains 不支持忽略大小写的查找
它完全按字节比对,遇到大小写差异就返回 false。比如:
strings.Contains("Hello", "hello") // false
常见错误是以为它像 Python 的 in 那样“智能”。实际没有。解决办法只有两个:
- 统一转小写再查:
strings.Contains(strings.ToLower(s), strings.ToLower(substr))(适合短字符串、不敏感场景) - 用
strings.EqualFold配合strings.Index手动遍历(复杂,仅当需精准 Unicode 大小写折叠时才考虑) - 注意:
strings.ToLower对非 ASCII 字符(如德语 ß、土耳其语 İ)可能有副作用,生产环境若涉及国际化,优先走bytes.EqualFold+bytes.Index组合
为什么不能用 strings.Contains 查正则或通配符
它只做朴素子串搜索,不解析任何特殊字符。传入 "a.c" 不会匹配 "abc",而是字面匹配字符串 "a.c" 三个字节。
- 想模糊匹配?必须换
regexp包:regexp.MustCompile(`a.c`).MatchString(s) - 正则有明显性能开销,尤其高频调用时;
Contains是 O(n) 且常数极小,regexp是 O(n×m) 或更差 - 常见误用:把用户输入直接塞进
regexp,没做regexp.QuoteMeta转义,导致 panic 或逻辑错乱
真正容易被忽略的是边界情况:strings.Contains("", "") 返回 true,空字符串被视作存在于任何字符串(包括自身)中——这符合定义,但业务逻辑里若没意识到,可能引发意料外的分支执行。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











