首页 > 分享 > golang split需要注意的一个点

golang split需要注意的一个点

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

所属分类:花卉
上一篇: 结婚不到一年女方花光钱离婚咋办
下一篇: 服装辅料激光烧花切割机 烫画定位