遇到问题

strings.Split
1
2
3
4
5
6
s := "11111|2222||3333||4444|"  
seps := "|"
rs := strings.Split(s, seps)
fmt.Println(rs)

// [11111 2222 3333 4444 ]
strings.Split
1
2
3
4
5
6
s := "11111|2222||3333,4444,,555"  
seps := ",|"
rs := strings.Split(s, seps)
fmt.Println(rs)

// [11111|2222||3333,4444,,555]

可以看到并没有对字符串做处理,直接返回了。

如果想要支持多个分隔符,则需要分别进行处理。

Split为空

如何解决

stringsstrings.FieldsFunc
1
2
3
4
5
6
7
8
s := "11111|2222||3333,4444,,555"  
seps := ",|"
rs2 := strings.FieldsFunc(s, func(r rune) bool {
return strings.ContainsRune(seps, r)
})
fmt.Println(rs2)

// [11111 2222 3333 4444 555]
ContainsRune空内容
func(r rune) bool {}

深入探究

f(c)c

相应的语法:

1
func FieldsFunc(str string,f func(rune bool)[] string
f(c)

再举一个示例:

1
2
3
4
5
6
7
8
f := func(c rune) bool {  
return unicode.IsNumber(c)
}

res := strings.FieldsFunc("ABC13DEF556", f)
fmt.Println(res)

// [ABC DEF]

整理

将其整理成一个工具方法:

1
2
3
4
5
6
7
// 对字符串使用任意字符分隔  
func StrSplitAny(s string, seps string) []string {
splitter := func(r rune) bool {
return strings.ContainsRune(seps, r)
}
return strings.FieldsFunc(s, splitter)
}

参考