能,但需分别调用两次strings.ReplaceAll;若要删除所有Unicode空白字符,应使用strings.Map配合unicode.IsSpace。

strings.ReplaceAll 能否直接删掉 \n 和 \t?
能,但必须分别调用两次——strings.ReplaceAll 只做字面量替换,不支持正则或字符类。想同时去掉换行符 \n 和制表符 \t,得写两行:
str = strings.ReplaceAll(str, "\n", "")str = strings.ReplaceAll(str, "\t", "")
顺序无关,但别漏掉任一调用;如果只处理 \n,\t 会原样留下。这不是 bug,是设计:它只认你给的完整子串,不会自动扩展语义。
为什么不用 regexp 替换 \s?
因为没必要,而且慢。正则引擎要编译模式、匹配、回溯,而 strings.ReplaceAll 是纯字节扫描,零分配、无状态、常数级开销。
- 对简单字符替换(如
\n、\t、),strings.ReplaceAll比regexp.ReplaceAllString快 3–5 倍 - 若真要用正则,必须提前编译:
var wsRe = regexp.MustCompile(`[\t\n\r\f\v]`),否则每次调用都重新编译,性能雪崩 -
\s在 Go 正则里默认不匹配全角空格、NBSP(\u00A0)等 Unicode 空白,语义反而不如unicode.IsSpace
删换行符时,strings.TrimSuffix 有用吗?
只对末尾有效,且仅限单个匹配。比如 strings.TrimSuffix("hello\n", "\n") 返回 "hello",但 strings.TrimSuffix("hello\n\n", "\n") 只删最后一个 \n,结果仍是 "hello\n"。
立即学习“go语言免费学习笔记(深入)”;
-
TrimSuffix/TrimPrefix不递归,也不全局 - 若目标只是“去掉行尾换行”,它比
ReplaceAll更精准、更轻量 - 但若字符串中间也有
\n,必须用ReplaceAll或strings.Map
真正要删“所有空白字符”,该用 unicode.IsSpace
如果你说的“换行符与制表符”其实是泛指所有空白(包括 \r、\f、\v、全角空格 \u3000、不换行空格 \u00A0),那就别拼一堆 ReplaceAll,直接上 strings.Map + unicode.IsSpace:
func removeAllWhitespace(s string) string {
return strings.Map(func(r rune) rune {
if unicode.IsSpace(r) {
return -1
}
return r
}, s)
}
这个函数一次遍历、零中间切片、覆盖全部 Unicode 空白,且逻辑明确。比连写五次 ReplaceAll 更可靠,也比正则更轻。
容易被忽略的是:很多场景下你以为只用删 \n 和 \t,结果上线后发现用户粘贴了全角空格或 Word 生成的段落符,数据解析就出错——这时候 unicode.IsSpace 才是兜底方案。


















