strings.TrimSpace只删除首尾Unicode空白符,不处理中间空格;如需清理中间空格,应按需选用strings.Fields+Join、strings.Map或ReplaceAll等方法。
strings.TrimSpace 为什么删不掉中间的空格?
只处理字符串首尾的 Unicode 空白符(包括
、
、
、U+0085 等),对中间的空格、制表符完全没反应。很多人误以为它等价于“去掉所有空白”,结果调试半天发现
经它处理还是
。
真要清理中间空格,得按需选:
- 全部替换成单空格:用
拆再
拼
- 只去多余空白(保留单词间一个空格):先
,再
- 纯删所有空白(含空格、制表、换行):用
配合
strings.Replace vs strings.ReplaceAll:Go 1.12 之后别乱用旧参数
在 Go 1.12 之前,
第四个参数是
表示全局替换;1.12 加了
,语义更直白。但问题来了:如果代码里还混着
,升级后不会报错,可读性差,且容易和
的局部替换逻辑混淆。
建议统一:
- 所有全局替换改用
,一眼看懂意图
- 局部替换(比如只换前 2 次)才用
- 注意:两个函数都**不支持正则**,想按模式替换得上
strings.Index 和 strings.Contains 判定失败时返回什么?
找不到子串时返回
,不是
或
;
返回布尔值,但底层其实也调了
。很多新手写成
,结果
里查
返回
,条件意外成立。
安全写法:
- 判存在性,直接用
- 要位置信息,检查
- 别拿
返回值直接参与算术(比如
),必须先校验
strings.Split 的空字符串边界行为很反直觉
返回
,不是
;
返回
,不是空切片。这和 Python 的
默认行为不同,容易引发越界或空指针。
立即学习
“
go语言免费学习笔记(深入)
”;
常见应对:
- 需要过滤空项:用
- 处理 CSV 类场景:别硬刚
,上
包更稳
- 对空输入敏感时,先加判断:
,别依赖
的默认行为
字符串操作看着简单,但 Unicode 边界、空输入、零值语义、性能隐式开销(比如反复
+
)这几个点,线上出过太多低级又难复现的问题。
strings.TrimSpace\t\n\r"a b c""a b c"strings.Fieldsstrings.Joinstrings.Fieldsstrings.Join(fields, " ")strings.Mapunicode.IsSpacestrings.Replace-1strings.ReplaceAllstrings.Replace(s, old, new, -1)n > 0strings.ReplaceAllstrings.Replace(s, old, new, n)regexp.ReplaceAllStringstrings.Index-10nilstrings.ContainsIndexif strings.Index(s, "x") != 0"abc""x"-1strings.Contains(s, "x")idx := strings.Index(s, "x"); if idx >= 0Indexs[idx+1:]idx != -1strings.Split("a,,b", ",")[]string{"a", "", "b"}{"a", "b"}strings.Split("", ",")[]string{""}str.split()strings.FieldsFunc(s, func(r rune) bool { return r == ',' })Splitencoding/csvif s == "" { return []string{} }SplitSplitJoin