跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

Golang Strings包常用函数集锦_字符串裁剪、替换与查找技巧

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

相关文章