Go-为什么空片的长度等于1

问题描述 投票:1回答:1

我是Go语言的初学者。我目前正在学习和练习,遇到了一些我不理解的东西。使用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功能的话)?

string go slice
1个回答
1
投票

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

打印为:

fmt.Printf("%q, %T, len %v\n", s, s, len(s))

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

[], []string, len 0
[""], []string, len 1

strings.Split()的文档:

strings.Split()

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

这正是发生的情况。您将空字符串传递给func Split(s, sep string) []string (即strings.Split()),该字符串显然不包含非空分隔符s,因此" "返回长度为1的片,其唯一元素为strings.Split()(空字符串)。

© www.soinside.com 2019 - 2024. All rights reserved.