使用strings.Split
拆分字符串时,如果输入字符串为空,则生成的空片的长度为1。
package main
import (
"strings"
"fmt"
)
func main() {
emptySlice1 := []string{}
debugSlice( emptySlice1 ) // prints "[], []string, len 0"
someStringToSplit := ""
emptySlice2 := strings.Split(someStringToSplit , " ")
debugSlice( emptySlice2 ) // prints "[], []string, len 1"
}
func debugSlice( s []string ){
fmt.Printf("%v, %T, len %v\n", s, s, len(s))
}
操场可以在这里找到:https://play.golang.org/p/kBYR048UtP_0
那是为什么?
如何检查切片内的实际项目数(如果没有使用len
函数)?
答案 0 :(得分:6)
因为它不是空的,而是包含一个string
(即空的fmt.Printf("%q, %T, len %v\n", s, s, len(s))
)的切片。
将其打印为:
[], []string, len 0
[""], []string, len 1
然后将输出(在Go Playground上尝试):
func Split(s, sep string) []string
strings.Split()
的文档:
strings.Split()
如果s不包含sep且sep不为空,则Split返回长度为1的切片,其唯一元素为s。
这正是发生的情况。您将空字符串传递给s
(即" "
),该字符串显然不包含非空分隔符strings.Split()
,因此s
返回长度为1的切片唯一的元素是{{1}}(空字符串)。
换句话说:您要求使用在输入中找不到的分隔符分割字符串,因此结果(输出)就是输入本身。