strings.Contains区分大小写,忽略时应优先用ContainsFold;Split对空串和连续分隔符保留空元素;TrimSuffix仅单次匹配后缀;Builder拼接需用WriteString并预分配。

如何使用Golang strings包处理字符串_Golang字符串处理常见技巧  第1张

strings.Contains 判断子串时要注意大小写敏感

strings.Contains 默认区分大小写,直接用它查 "Go" 是否在 "golang" 中会返回 false。如果需要忽略大小写,别先转全大写再查——那可能破坏 Unicode 字符(比如土耳其语的 i)。更稳妥的做法是用 strings.Contains(strings.ToLower(s), strings.ToLower(substr)),或者直接上 strings.ContainsFold

found := strings.ContainsFold("GOLANG", "go") // true

注意:ContainsFold 虽然语义清晰,但内部做了更多 Unicode 归一化,性能略低于 Contains,高频路径里要权衡。

strings.Split 处理空字符串和连续分隔符的边界行为

strings.Split("a,,b", ",") 返回 []string{"a", "", "b"},中间那个空字符串容易被忽略,导致后续 for range 时 panic 或逻辑错乱。常见错误是没检查切片长度就取 parts[1]

  • 若想跳过空段,用 strings.FieldsFunc(s, func(r rune) bool { return r == ',' })
  • 若需保留结构但过滤空项,手动遍历 + len(part) > 0 判断
  • strings.SplitN(s, ",", 2) 可限制最多切出 2 段,避免过度分割

strings.TrimSuffix 和 TrimPrefix 不会递归去除

strings.TrimSuffix("foo.bar.baz", ".bar.baz") 返回 "foo",但 strings.TrimSuffix("foo.bar.baz", ".baz") 不会继续去掉 ".bar"——它只匹配后缀一次,不回溯。这点和 Trim 类似,不是“反复剥皮”。

立即学习“go语言免费学习笔记(深入)”;

如果真要循环去后缀(比如清理多层扩展名),得自己写循环:

for _, suffix := range []string{".gz", ".bz2", ".zip"} {
    s = strings.TrimSuffix(s, suffix)
}

另外注意:传入空字符串 "" 作后缀,TrimSuffix 直接返回原字符串,不会 panic,但容易掩盖逻辑错误。

strings.Builder 拼接大量字符串时必须用 WriteString 而非 .WriteString 的常见误写

拼接场景下,strings.Builder 是零分配首选,但新手常把方法名记成 AppendString 或漏掉 Write 前缀。正确写法只有 WriteStringWrite(后者接受 []byte):

var b strings.Builder
b.Grow(1024) // 预分配避免多次扩容
b.WriteString("hello")
b.WriteString(" ")
b.WriteString("world")

忘记调用 Grow 在拼接上千段时会导致多次底层数组复制;而误用 b.String() 中途多次调用会触发不必要的字符串转换,影响性能。Builder 实例不能复用(Reset() 后可重用),但别在 goroutine 间共享——它没有并发安全保证。