【问题标题】:Why is the length of empty slice equal to 1? [closed]为什么空切片的长度等于1? [关闭]
【发布时间】:2020-04-25 21:03:09
【问题描述】:

分割字符串时,使用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】:

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

    像这样打印:

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

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

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

    strings.Split()的文档:

    func Split(s, sep string) []string
    

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

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

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

    【讨论】:

    • 天哪... Go 太奇怪了!不过谢谢! %q 是什么意思?
    • 包文档说它仅适用于整数...
    • @Eria 对不起,引用了错误的部分。编辑了我之前的评论。它列在“字符串和字节切片”下。
    • @Eria 在大多数语言中长度为 1。去没有什么特别的。 :)
    • 没错。您要求使用输入中未找到的分隔符拆分字符串。所以结果就是输入本身。
    猜你喜欢
    • 2015-10-19
    • 2013-03-08
    • 1970-01-01
    • 2017-08-08
    • 2020-07-11
    • 2013-08-17
    • 2013-01-05
    • 1970-01-01
    • 2022-04-12
    相关资源
    最近更新 更多