strings.split 切出空字符串是因分隔符连续或位于首尾,属设计行为;需过滤空项应手动遍历判断;splitn 可按首次匹配分割;replaceall 等价于 replace(s, old, new, -1),replace 支持限制替换次数;contains 适合判断存在性,index 适合定位后操作;toupper/tolower 默认 unicode 处理,多语言场景推荐 x/text/cases。

strings.Split 为什么切出来空字符串?
分隔符连续出现或位于首尾时,strings.Split 会保留空项——这不是 bug,是设计行为。比如 strings.Split("a,,b", ",") 返回 []string{"a", "", "b"},不是 ["a", "b"]。
- 需要过滤空字符串?自己用
for遍历 +len(s) > 0判断,标准库不提供自动去空选项 - 想按首次匹配分割?用
strings.SplitN(s, sep, 2),第三个参数设为2,避免全量切分影响性能 - 处理用户输入(如 CSV 片段)时,别直接信
Split结果长度,先检查是否有空项再取值,否则容易 panic
strings.ReplaceAll 和 strings.Replace 区别在哪?
strings.ReplaceAll 是 Go 1.12+ 引入的简化版,等价于 strings.Replace(s, old, new, -1);而 strings.Replace 第四个参数是最大替换次数,传 0 表示不替换,传 1 只换第一个。
- 批量替换固定子串,无脑用
strings.ReplaceAll,语义清晰且少输参数 - 要控制替换上限(比如只修前两处 typo),必须用
strings.Replace,并显式传数字 - 注意:两个函数都返回新字符串,原字符串不可变;频繁拼接建议改用
strings.Builder,避免重复分配内存
查找子串用 Index 还是 Contains?
strings.Contains 只返回 bool,适合判断存在性;strings.Index 返回位置(int),找不到时返回 -1,适合后续切片或定位操作。
- 只要“有没有”,用
Contains,代码短、意图明确、性能略好(底层可能早停) - 要“在哪儿”或“之后怎么截”,必须用
Index或IndexAny/IndexFunc等变体 - 别对
Index结果不做检查就直接切片:s[i:]在i == -1时 panic,得先判断i >= 0
大小写转换要注意 Unicode 吗?
Go 的 strings.ToUpper 和 strings.ToLower 默认按 Unicode 规则处理,对 ASCII 没问题,但遇到土耳其语 i、德语 ß 等会出意料结果——比如 strings.ToLower("İ") 不是 "i",而是带点的 "i̇"。
- 纯 ASCII 场景(如 HTTP 头、文件名、命令行参数),放心用,快且准
- 涉及多语言用户输入或显示文本,优先考虑
golang.org/x/text/cases包,它支持 locale-aware 转换 - 别拿
ToUpper做 map key 归一化——不同语言下同一词转大写可能不等,导致 map 查不到
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











