遇到问题
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)
}