要用 strings.replaceall 删除 ascii 空格,用预编译正则 regexp.mustcompile(\s+) 处理所有 unicode 空白(需显式添加 \u3000 支持全角空格),或手写 for 循环实现零分配高性能过滤。

Go 语言里想彻底去掉字符串里的所有空格(包括中间、开头、结尾的普通空格、制表符、换行符等),别用 strings.TrimSpace ——它只去首尾,对中间的空格完全没用。
用 strings.ReplaceAll 最快最直观地删掉普通空格
如果只要干掉 ASCII 空格(' '),不碰制表符 '\t' 或换行 '\n',strings.ReplaceAll 是零分配、无正则开销的首选:
- 写法简单:
strings.ReplaceAll(s, " ", "") - 性能好:底层是 memmove,比正则快 3–5 倍(实测 10KB 字符串)
- 注意:它只替换字面量
" ",不会动"\t"或全角空格
用正则 regexp.MustCompile(`\s+`) 处理所有空白字符
要清掉所有 Unicode 空白(空格、制表、换行、回车、换页、垂直制表等),必须上正则。但别每次调用都编译——提前 MustCompile 一次:
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 推荐写法:
var spaceRe = regexp.MustCompile(`\s+`) clean := spaceRe.ReplaceAllString(s, "")
- 用
ReplaceAllString而非ReplaceAll:避免额外的[]byte转换开销 - 正则模式选
\s+而不是\s:减少替换次数,提升性能(尤其长文本) - ⚠️ 注意:
\s在 Go 正则里默认不匹配全角空格(U+3000),需显式加进去:[\s\u3000]+
手写遍历过滤比正则还快?真有这回事
当性能压到极致(比如高频处理短字符串),自己写 for 循环过滤,比正则和 ReplaceAll 都快,且内存零分配:
- 示例逻辑:
func removeWhitespace(s string) string { b := make([]byte, 0, len(s)) for i := 0; i - 优势:可控性强,能精确决定哪些码点算“空白”(比如要不要留
\u3000) - 代价:代码变长,维护成本上升;对超长字符串,不如正则易读
真正麻烦的不是“怎么删”,而是“你到底想删哪几种空白”。\s 的行为在不同语言里有差异,Go 的 regexp 包不支持 \s 匹配全角空格,这点很容易被忽略——结果线上日志里一堆 残留,查半天才发现正则没覆盖到。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










