为什么空切片的长度等于1?

Eri*_*ria -5 string go slice

拆分字符串时,使用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))
}
Run Code Online (Sandbox Code Playgroud)

游乐场可以在这里找到:https : //play.golang.org/p/kBYR048UtP_0

这是为什么?如何检查切片内的实际项目数(如果没有len功能)?

icz*_*cza 7

因为它不是空的,而是一个包含 1 的切片string,即空的string

打印如下:

fmt.Printf("%q, %T, len %v\n", s, s, len(s))
Run Code Online (Sandbox Code Playgroud)

然后输出将是(在Go Playground上尝试):

[], []string, len 0
[""], []string, len 1
Run Code Online (Sandbox Code Playgroud)

文件strings.Split()

func Split(s, sep string) []string
Run Code Online (Sandbox Code Playgroud)

如果 s 不包含 sep 并且 sep 不为空,则 Split 返回长度为 1 的切片,其唯一元素是 s。

这正是发生的事情。您将空字符串传递给strings.Split()(is s),它显然不包含非空分隔符" ",因此strings.Split()返回一个长度为 1 的切片,其唯一元素是s(空字符串)。

换句话说:您要求使用在输入中找不到的分隔符拆分字符串,因此结果(输出)就是输入本身。