go1.6.2 strings.Split()我觉得有些问题

来源:互联网 发布:武汉淘宝大学官网 编辑:程序博客网 时间:2024/05/22 03:37

go1.6.2 strings.Split()bug

当调用strings.Split(s,seq string)时,如果seq连续出现,比如s=" dfdgdfg (多个空格) dfdg (多个空格) hghyjkjuyk "。调用slice:=strings.Split(s," ")将会出现len(slice)!=3,我认为这并不是大家希望看到的结果。

查看strings.Split(s,seq string)源码:
func Split(s, sep string) []string { return genSplit(s, sep, 0, -1) }

接着查看strings.genSplit()源码:
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
}
c := sep[0]
start := 0
a := make([]string, n)
na := 0
for i := 0; i+len(sep) <= len(s) && na+1 < n; i++ {
if s[i] == c && (len(sep) == 1 || s[i:i+len(sep)] == sep) {
a[na] = s[start : i+sepSave]
na++
start = i + len(sep)
i += len(sep) - 1
}
}
a[na] = s[start:]
return a[0 : na+1]
}

发现并没有做相关的判断就将s[start : i+sepSave]添加到返回数组造成出现这种情况;

顾在for循环中添加一个判断以达到预期返回值,代码如下:
if s[i] == c && (len(sep) == 1 || s[i:i+len(sep)] == sep) {
splitStr:=s[start : i+sepSave]
if !(splitStr == sep || start==i+sepSave) {
a[na] = splitStr
na++
}
start = i + len(sep)
i += len(sep) - 1
}

之后调用即可达到预期返回值

0 0
原创粉丝点击