str := "1,2,3,4"
arr := strings.Split(str, ",")
fmt.Printf("%qn", arr)
fmt.Println(len(arr))
str = ""
arr = strings.Split(str, ",")
fmt.Printf("%qn", arr)
fmt.Println(len(arr))
["1" "2" "3" "4"]
4
[""]
1
Go
在case1的情况,没什么问题;在case2的情况下,len(arr) 的值是 1
原因:
Split(s,sep string) 方法底层调用下面的方法genSplit(),其中n=-1<0意思是把待查字符串中所有的分段都返回
func genSplit(s, sep string, sepSave, n int) []string {
if n == 0 {
return nil
}
if sep == "" {
return explode(s, n)
}
if n < 0 {
n = Count(s, sep) + 1
}
a := make([]string, n)
n--
i := 0
for i < n {
m := Index(s, sep)
if m < 0 {
break
}
a[i] = s[:m+sepSave]
s = s[m+len(sep):]
i++
}
a[i] = s
return a[:i+1]
}
Go
n = Count(s, sep) + 1,其中的Count()方法如下,也是调用的底层的internal/bytealg包里的CountString(s string,sep byte) int方法
func Count(s, substr string) int {
if len(substr) == 0 {
return utf8.RuneCountInString(s) + 1
}
if len(substr) == 1 {
return bytealg.CountString(s, substr[0])
}
n := 0
for {
i := Index(s, substr)
if i == -1 {
return n
}
n++
s = s[i+len(substr):]
}
}
Go
CountString()的方法如下:
func countGenericString(s string, c byte) int {
n := 0
for i := 0; i < len(s); i++ {
if s[i] == c {
n++
}
}
return n
}
Go
为什么空字符串会返回长度为1的空字符串数组——[""],就是因为countGenericString("",",")返回了0,这个0在genSplit()里第9行与1相加,在第12行处创建了一个长度为1的字符串数组。
它这么做也不是因为啥,只是说我给你一个字符串a,按某个字符串b进行分割,如果没有能分割的,那就返回a,返回原始的数据。
Split()方法原理,遍历了两次字符串,第一轮的作用在于创建长度为n的slice,为第二轮来存放最后的结果。空间换时间。空间O(n),时间O(n)。
相关知识
小花golang
Golang字符串多行处理攻略:轻松实现代码美观与可读性
Golang高性能开源电商框架:构建高效在线商店的最佳选择
JS实现Split分割字符串同时允许被分割出的字符串中存在分割符号
Golang复习笔记要点
golang 编译安装kata container (二)
pandas的字符串的分割之str.split()
养花需要注意点什么啊?
建立鲜花保鲜库需要注意哪些关键点?
水培花卉注意点,水培花卉注意点有哪些
网址: golang split需要注意的一个点 https://m.huajiangbk.com/newsview2469720.html
| 上一篇: 结婚不到一年女方花光钱离婚咋办 |
下一篇: 服装辅料激光烧花切割机 烫画定位 |