go字符串检索应使用strings.contains、strings.index、strings.hasprefix覆盖95%场景:contains查存在性(语义清晰、底层优化),index查首次字节位置(需判-1),hasprefix查前缀(更直观高效);三者均大小写敏感,且index返回字节偏移而非rune索引。

Go 字符串检索不是靠自己写循环,而是用 strings.Contains、strings.Index、strings.HasPrefix 这三个函数覆盖 95% 的真实场景。
查子串存在性:用 strings.Contains,别手写 for
日常最常误踩的坑是:想确认配置里有没有 "debug=true",却写了个遍历 []byte 的循环加字节比对。这既慢又易错(尤其遇到 UTF-8 多字节字符时)。
-
strings.Contains(s, substr)返回bool,语义清晰,底层调用优化过的memchr,比手写快且安全 - 它大小写敏感;如需忽略大小写,先统一转小写:
strings.Contains(strings.ToLower(s), strings.ToLower(substr)) - 不支持通配或正则;若要模糊匹配(比如“log*error”),得上
regexp包,别硬塞Contains
查子串位置:用 strings.Index 或 strings.LastIndex,注意返回值
当你需要知道“timeout 在日志第几个字节出现”,而不是只判断“有没有”,就该用 Index。
-
strings.Index(s, "timeout")返回首次出现的字节偏移(int),没找到时返回-1—— 必须判空,否则切片会 panic - 要找最后一次?用
strings.LastIndex,逻辑对称,同样返回字节偏移 - 别用
Index的结果直接做rune切片:它返回的是字节索引,不是字符索引;中文被截断的风险极高 - 如果真要按“第几个 Unicode 字符”定位,得先转
[]rune,再遍历索引,但这是少数场景,别当成默认路径
查前缀/后缀:优先用 strings.HasPrefix 和 strings.HasSuffix
这类判断非常高频:协议头是否为 "https://"、文件名是否以 ".json" 结尾、HTTP Header 是否含 "Content-Type:"。
- 它们比
strings.Index(s, prefix) == 0更直观、更高效(内部短路判断,不扫描全串) - 参数顺序固定:
strings.HasPrefix(s, prefix),别把两个参数颠倒 - 和
Contains一样,大小写敏感;需要忽略时,同样建议先统一大小写再查 - 注意:前缀检查不要求
s长度 ≥prefix,函数内部已处理边界,放心用
真正容易被忽略的是字节偏移与字符索引的混淆——Index 返回的永远是字节位置,而 Go 字符串是 UTF-8 编码,一个中文字符占 3 字节。拿这个值去 s[i:j] 切片没问题,但拿它当“第几个字”去算 []rune 下标,就会出错。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











