1. 字符串定义:双引号 vs 反引号
// 双引号字符串(支持转义字符)
str1 := "Hello\tWorld!\n" // 包含制表符和换行符
fmt.Println(str1) // 输出:Hello World! (换行)
// 反引号字符串(原始字符串,不支持转义)
str2 := `Hello\tWorld!\n`
fmt.Println(str2) // 输出:Hello\tWorld!\n
关键区别:
- 双引号字符串:支持转义序列(
\t
,\n
,\"
等) - 反引号字符串:保留所有原始字符(包括换行和特殊符号),常用于正则表达式、多行文本
2. 字符串修剪函数对比
import "strings"
func main() {
// 示例字符串
s := "!!Hello! Go!!!"
// 去除前后指定子串(仅1次)
fmt.Println(strings.TrimPrefix(s, "!!")) // "Hello! Go!!!"
fmt.Println(strings.TrimSuffix(s, "!!")) // "!!Hello! Go!"
// 去除前后所有指定字符
fmt.Println(strings.Trim(s, "!")) // "Hello! Go"
fmt.Println(strings.TrimLeft(s, "!")) // "Hello! Go!!!"
fmt.Println(strings.TrimRight(s, "!")) // "!!Hello! Go"
}
核心区别:
函数 | 作用范围 | 去除内容 | 示例输入 | 示例输出 |
---|---|---|---|---|
TrimPrefix | 前缀 | 1个指定子串 | "!!Hello!" | "Hello!" |
TrimSuffix | 后缀 | 1个指定子串 | "Hello!!!" | "Hello" |
Trim | 两端 | 所有指定字符 | "!!Hello!!" | "Hello" |
TrimLeft/TrimRight | 单端 | 所有指定字符 | "~~Hi~~" | "Hi~~" /"~~Hi" |
3. 使用TrimFunc去除中文字符
import (
"strings"
"unicode"
)
func main() {
str := "Hello! 你好,世界!123"
// 方法1:使用自定义函数(去除所有>238的字符)
result1 := strings.TrimFunc(str, func(r rune) bool {
return r > 238 // 简单过滤部分中文字符
})
fmt.Println(result1) // "Hello! 123"(部分中文可能残留)
// 方法2:精确去除所有中文(推荐)
result2 := strings.Map(func(r rune) rune {
if unicode.Is(unicode.Han, r) {
return -1 // 删除字符
}
return r
}, str)
fmt.Println(result2) // "Hello! ,!123"
}
关键说明:
-
TrimFunc
原理:- 遍历字符串的每个
rune
- 当回调函数返回
true
时删除字符 r > 238
:简单过滤Unicode值大于238的字符(涵盖大部分中文)
- 遍历字符串的每个
-
更准确的方案:
- 使用
unicode.Is(unicode.Han, r)
判断汉字 - 结合
strings.Map
实现全字符串处理(而非仅首尾) - 处理标点符号:中英文标点Unicode不同,需额外处理
- 使用
注意:直接使用
r > 238
可能误删非中文字符(如希腊字母),建议使用unicode.Han
范围精确匹配。
总结对比表
场景 | 推荐方法 | 注意事项 |
---|---|---|
转义字符串 | 双引号 " " | 支持\n 、\t 等转义 |
原始字符串 | 反引号 ` ` | 保留所有原始格式 |
精确去除前后缀 | TrimPrefix /TrimSuffix | 仅去除1次匹配 |
批量去除首尾字符 | Trim 系列 | 删除所有指定字符 |
按条件删除字符 | TrimFunc /strings.Map | 优先使用unicode 标准库判断 |