在Go语言里处理字符串时,我们常常需要按照多个不同的符号来切分内容,比如同时用逗号、分号和空格来拆分一段文本。标准库的strings.Split只支持一个分隔符,不够灵活。利用rune数组可以把多个分隔符统一管理,再自己写一个简单的分割函数就能解决问题。

为什么使用rune数组
Go语言的字符串底层是字节序列,但中文等字符可能占多个字节。使用rune可以把字符串按Unicode字符拆开,避免截断乱码。把分隔符也定义为[]rune类型,就能在遍历时直接比较字符是否等于某个分隔符。
核心实现思路
基本思路是:将原始字符串转为rune切片,准备一个rune数组存放所有分隔符;从头遍历每个字符,若当前字符是分隔符,就把之前累积的非分隔符部分追加到结果中,并清空缓存。
- 把字符串转成rune切片,方便按字符处理
- 用map或遍历方式判断字符是否属于分隔符集合
- 遇到非分隔符就拼接到临时变量,遇到分隔符就切出一段
完整代码示例
下面给出一个简单且通用的多分隔符分割函数:
package main
import (
"fmt"
)
// SplitMulti 按多个分隔符分割字符串
// seps 为分隔符组成的字符串,如 ",. "
func SplitMulti(s string, seps string) []string {
sepRunes := []rune(seps)
// 用map快速判断是否为分隔符
sepMap := make(map[rune]bool)
for _, r := range sepRunes {
sepMap[r] = true
}
var result []string
var cur []rune
for _, r := range s {
if sepMap[r] {
// 遇到分隔符,保存当前段
result = append(result, string(cur))
cur = cur[:0]
} else {
cur = append(cur, r)
}
}
// 不要漏掉最后一段
result = append(result, string(cur))
return result
}
func main() {
text := "苹果,香蕉;橘子 西瓜"
parts := SplitMulti(text, ",; ")
for i, p := range parts {
fmt.Printf("第%d段: %sn", i, p)
}
}
注意事项
上面的代码会把连续的分隔符切出空字符串。如果不想保留空段,可以在追加前判断len(cur) > 0。另外,分隔符字符串本身也可以先转成rune数组再使用,逻辑是一致的。
使用rune数组的方式比正则更高效,也更容易理解和修改,适合大多数固定多分隔符场景。
小结
通过把分隔符放进rune数组并结合map判断,我们可以用很少的代码在Go中实现灵活的多分隔符字符串分割。这种方法对中文友好,性能也不错,可以封装成工具函数供项目复用。