Go strings包仅支持不可变字符串的纯函数操作,不支持正则替换、Unicode智能分词或原地修改;strings.Replace返回新字符串且默认只替换一次(第4参数为-1才全量替换),strings.Split对空分隔符按rune切分并保留空元素,strings.Contains和Index不处理重叠匹配,strings.Count统计非重叠子串,高频拼接应使用strings.Builder。
Go 的 strings 包不是“万能字符串处理器”,它只做不可变字符串的纯函数式操作,不支持正则替换、Unicode 智能分词或原地修改。用错场景(比如想改原字符串、处理带组合字符的文本)会白忙活。
strings.Replace 不改原字符串,且默认只换一次?strings.Replace 返回新字符串,原变量不变;它的第 4 个参数是最大替换次数,-1 才表示全部替换——这点和 Python 的 str.replace() 行为一致,但容易被忽略。
strings.Replace(s, "a", "b", 1) 只换第一个 "a",不是“换所有”strings.Replace(s, "old", "new", -1)
s = strings.Replace(s, "x", "y", -1)
strings.Replacer
strings.Split 遇到空分隔符或连续分隔符怎么分?strings.Split 把空字符串 "" 当作 Unicode 码点切分(即拆成单个 rune),而连续分隔符会产生空字符串元素——这和大多数语言的默认行为不同,容易导致逻辑 bug。
fmt.Println(strings.Split("a,,b", ",")) // ["a" "" "b"]
fmt.Println(strings.Split("hello", "")) // ["h" "e" "l" "l" "o"]
if sep == "" { ... }
strings.Fields 替代(它按 Unicode 空白字符分割,自动跳过空字段)strings.SplitN(s, sep, n) 限制切分次数strings.Contains 和 strings.Index 能不能处理子串重叠?可以,但方式不同:strings.Contains 只返回布尔值,不关心重叠;strings.Index 总是返回第一次出现的位置,不提供后续匹配。真要找所有重叠位置,得手动循环 + strings.Index 偏移。
s := "aaaa" fmt.Println(strings.Contains(s, "aa")) // true fmt.Println(strings.Index(s, "aa")) // 0(只返回第一个) // 手动找重叠:从 i=0 开始,每次 Index 后 i++ 而非 i+=len(substr)
strings.Count 统计的是**非重叠**子串
strings.Count("aaaa", "aa") 返回 2
strings.Index(s[i:], substr) 并更新 i
strings.ToLower 统一转换最常被低估的是 strings.Builder——它不是 strings 包里的函数,但和字符串拼接强相关。用 + 或 fmt.Sprintf 拼接大量字符串时,性能可能差一个数量级。真正高频拼接,请直接上 strings.Builder,别只盯着 strings 包里那些“查、分、替”函数。