如何检查空切片?

Ksh*_*rma 51 go slice

我正在调用一个函数,如果没有值,则返回一个空数组.

当我这样做时,它不起作用:

if r == [] {
    fmt.Println("No return value")            
}
Run Code Online (Sandbox Code Playgroud)

我正在使用的工作是:

var a [0]int
if r == a {
    fmt.Println("No return value")            
}
Run Code Online (Sandbox Code Playgroud)

但是声明一个变量只是为了检查返回值似乎并不正确.有什么更好的方法呢?

Sim*_*tti 74

len() 返回切片或数组中的元素数.

假设whatever()是您调用的函数,您可以执行以下操作:

r := whatever()
if len(r) > 0 {
  // do what you want
}
Run Code Online (Sandbox Code Playgroud)

或者如果您不需要这些物品

if len(whatever()) > 0 {
  // do what you want
}
Run Code Online (Sandbox Code Playgroud)

  • @nawaz 是的,但这是预期的,不是吗?即使在 var num []int = nil 的情况下,len(num) 返回 0。在我看来,这就是完美的。这样我就不需要事先进行 nil 检查。如果我确实需要检查 nil ,我可以明确地添加它。但再次谈到未初始化的 var,同意它应该为 0。因为 len 只能返回一个 int 那么这是完全有道理的。在我看来,-1 的 len 返回值会让人非常困惑。 (5认同)
  • 这种方法的问题在于,刚刚声明的切片(如var num [] int)也将len返回为零。即`len(num)== 0` (2认同)

abh*_*ink 12

你可以使用这个len功能.

if len(r) == 0 {
    fmt.Println("No return value")            
}
Run Code Online (Sandbox Code Playgroud)

虽然由于您使用的是数组,但是类型[0]int数组(大小为0的int数组)与[n]int(n大小为n的int数组)不同,并且彼此不兼容.

如果你有一个返回不同长度数组的函数,可以考虑使用slice,因为函数只能用具有特定长度的数组返回类型声明(例如func f() [n]int,n是一个常量),并且该数组中将包含n个值(它们是'即使该函数从未向该数组写入任何内容,也将被置零.


ASH*_*EEV 8

您可以使用Golang提供的内置函数

长度()

它将帮助您轻松找到切片是否为空。

if len( yourFunction() ) == 0 {
    // It implies that your array is empty.
}
Run Code Online (Sandbox Code Playgroud)