strings.TrimSpace最简单,用于去除两端Unicode空白字符,但不支持中文全角空格或BOM;strings.Trim可自定义裁剪字符集;TrimLeft/TrimRight分别处理单侧;复杂模式需用正则。

用 strings.TrimSpace 去除两端空白字符最简单
如果只是要去掉字符串开头和结尾的空格、制表符、换行符等 Unicode 空白字符,strings.TrimSpace 是标准库里最直接的选择。它内部调用 unicode.IsSpace 判断每个字符是否为空白,兼容性好,性能也够用。
常见错误是误以为它能去掉中文全角空格或 BOM 字符——它不能。strings.TrimSpace 对 \u3000(中文空格)或 \ufeff(BOM)完全无效,这些得手动处理。
示例:
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
import "strings" s := "\t hello world\n" result := strings.TrimSpace(s) // result == "hello world"
用 strings.Trim 自定义去除指定字符
当需要去掉两端的特定字符(比如引号、斜杠、下划线),就得用 strings.Trim。它接收两个参数:原字符串和要裁剪的字符集(作为字符串传入),第二个参数里的**每个字符都会被单独匹配**,顺序无关。
立即学习“go语言免费学习笔记(深入)”;
容易踩的坑:
- 传入空字符串
""会 panic:运行时报panic: strings: Trim: invalid argument - 字符集包含 Unicode 多字节字符(如 emoji 或中文)完全没问题,但要注意它是按
rune比较,不是按字节 - 只裁剪“两端”,中间的相同字符保留不动
示例:
s := `"\"/hello/world/\""` result := strings.Trim(s, `"/`) // result == "hello/world"
注意 strings.TrimLeft 和 strings.TrimRight 的方向性
如果只需要裁剪左端或右端,别硬套 Trim 再补逻辑。Go 提供了明确的 strings.TrimLeft 和 strings.TrimRight,语义清晰,性能略优(少一次遍历)。
使用场景举例:
- 解析路径时去掉开头的
/:用strings.TrimLeft(s, "/") - 清理用户输入末尾的分隔符(如逗号、顿号):用
strings.TrimRight(s, ",,、") - 注意:
TrimLeft不等于 “从左边开始裁到第一个不匹配字符为止”——它会持续裁剪直到遇到第一个不在字符集里的 rune
示例:
s := "///abc//" left := strings.TrimLeft(s, "/") // "abc//" right := strings.TrimRight(s, "/") // "///abc"
需要正则或复杂逻辑时,别硬扛,改用 regexp.ReplaceAllString
当要去掉的模式不是简单字符集合,而是带条件的(比如“连续两个以上空格只留一个”“去掉开头的数字前缀但保留中间的”),strings.Trim* 完全无能为力。这时候必须上正则。
性能提醒:正则比 strings 函数慢一个数量级,纯空格/单字符裁剪绝不该用正则;但只要逻辑稍复杂,早切正则反而省调试时间。
示例(去掉开头任意数量的数字):
import "regexp" re := regexp.MustCompile(`^\d+`) s := "123abc456" result := re.ReplaceAllString(s, "") // "abc456"
真正难处理的是混合 Unicode 边界(比如中英文混排时的全角/半角空格共存),这种场景建议先标准化(如用 golang.org/x/text/unicode/norm Normalize),再裁剪——否则靠试错写 Trim 参数容易漏。

















