无论哪种开发语言,Split函数都是经常用到。最近发现了strings包里的Split函数有个坑,真是活久见。
package main
import "fmt"
import "strings"
func main() {
str := ""
v := strings.Split(str, "#")
if len(v)%2 != 0 {
fmt.Printf("v len is [%d]", len(v))
}
}
期望获得结果应该是0,因为经常读数据字段的时候会做是不是几元组的判断。实际输出为:
v len is [1]
来看Split的实现
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]
}
可以看到最后的返回的slice最少也有一个值。细节要多注意啊,不能用固有观念来看新东西。