分享
strings包里面的Split函数的坑
Cedrus · · 3051 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
无论哪种开发语言,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最少也有一个值。细节要多注意啊,不能用固有观念来看新东西。
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信3051 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
无论哪种开发语言,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最少也有一个值。细节要多注意啊,不能用固有观念来看新东西。