strings.trimspace 是最稳妥选择,移除所有 unicode 空白字符后判空;内存敏感场景可用 utf8.decoderuneinstring + unicode.isspace 手动遍历;避免 strings.trim 或正则,因不兼容 unicode 且性能差。

用 strings.TrimSpace 判断是否为空白字符串最直接
对大多数场景来说,strings.TrimSpace 是最稳妥的选择:它会移除 Unicode 定义的全部空白字符(包括 ' '、'\t'、'\n'、'\r'、'\f'、'\v' 以及 Unicode 中的其他空格类字符),再判断结果是否为空串。
示例:
Colly 是一个用于 Go 语言的快速开源爬取和爬虫框架。它适用于从简单的页面提取到异步爬虫处理大量页面集合,支持请求回调和结构化解析。
import "strings"
func isBlank(s string) bool {
return strings.TrimSpace(s) == ""
}
- 优点:语义清晰、兼容 Unicode、标准库保证行为稳定
- 缺点:会分配新字符串(对超长字符串如 >1MB 的纯空白串,有额外内存开销)
- 注意:
strings.TrimSpace不修改原字符串,所以不会意外影响调用方持有的引用
用 utf8.DecodeRuneInString 手动遍历更省内存
当字符串极长(比如日志行、HTTP body 片段)且已知大概率是空白时,避免分配新字符串,可逐 rune 检查。Go 的空白判定应以 unicode.IsSpace 为准,而非只查 ASCII 空格。
示例:
import (
"unicode"
"unicode/utf8"
)
func isBlankFast(s string) bool {
for len(s) > 0 {
r, size := utf8.DecodeRuneInString(s)
if !unicode.IsSpace(r) {
return false
}
s = s[size:]
}
return true
}
- 适合对内存敏感或字符串长度不可控的场景(如解析用户上传文本)
- 比
strings.TrimSpace少一次完整拷贝,但循环本身有少量开销 - 不要用
for _, r := range s—— 它会复制每个 rune 到局部变量,且无法提前退出(即使第一个 rune 就非空白,仍会完成整个 range)
别用 strings.Trim 或正则做这事
常见误区是用 strings.Trim(s, " \t\n\r\f\v") 或 regexp.MustCompile(`^\s*$`).MatchString,这两者都有明显缺陷:
-
strings.Trim只处理 ASCII 空格集,漏掉如 (U+00A0)、全角空格(U+3000)等合法 Unicode 空格 - 正则引擎启动成本高,
\s在 Go 的regexp包中默认不匹配所有 Unicode 空格(需加(?U)标志),且编译 + 执行远慢于前述两种方案 - 哪怕字符串只有 10 字节,正则也要走完整状态机;而
TrimSpace或手动遍历在首个非空白 rune 就能返回false
性能差异实际没那么大,但边界 case 很关键
在普通长度(strings.TrimSpace 和手动遍历耗时差距不到 10ns,几乎可忽略。真正拉开差距的是两类 case:
- 超长纯空白字符串(如 10MB 的空格):手动遍历不分配内存,
TrimSpace会 malloc 一块等长新内存 - 开头就含非空白字符的字符串(如
"x..."):手动遍历最快(1 次 decode 就返回),TrimSpace仍需扫描到第一个非空白处再截断,但内部优化较好,实际也很快 - 混合 Unicode 空格(如含
U+2000~U+200F):只有unicode.IsSpace和TrimSpace能正确识别,自定义字符集 trim 必然漏判
如果你不确定输入来源是否含非 ASCII 空格,或者字符串长度可能失控,优先选 strings.TrimSpace;如果明确控制输入、且 profiling 确认此处是瓶颈,再上手动遍历。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










