如何检查空切片?

Posted

技术标签:

【中文标题】如何检查空切片?【英文标题】:How do I check for an empty slice? 【发布时间】:2016-11-03 18:51:03 【问题描述】:

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

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

if r == [] 
    fmt.Println("No return value")            

我正在使用的解决方法是:

var a [0]int
if r == a 
    fmt.Println("No return value")            

但是仅仅为了检查返回值而声明一个变量似乎是不对的。有什么更好的方法来做到这一点?

【问题讨论】:

Go 不是 javascript!阅读基础知识:golang.org/doc/effective_go.html 更多东西 - 首先 - 数组不是切片。数组是类型,具有固定数量的元素,因此问题仅对切片有意义。其次 - 如果您初始化这些切片,它将不起作用。第三 - 如果 len(a) == 0 呢? 您的解决方法是否编译?除非r 也是[0]int 类型,否则我看不到它会如何,但在这种情况下,两个(空)数组总是比较相等。 @PaulHankin 是的,它确实有效。函数的返回类型是 int[] 【参考方案1】:

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

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

r := whatever()
if len(r) > 0 
  // do what you want

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

if len(whatever()) > 0 
  // do what you want

【讨论】:

这种方法的问题是刚刚声明的切片,如var num []int,也将 len 返回为零。即len(num) == 0 @nawaz 是的,但这是意料之中的,不是吗?即使在 var num []int = nil 的情况下, len(num) 也会返回 0。这只是完美的 imo。这样我就不需要事先进行 nil 检查。如果我确实需要检查 nil,我可以明确添加。但是再次到未初始化的 var 的观点,同意它应该是 0。因为 len 只能返回一个 int,所以这很有意义。 -1 的 len return val 会让 imo 非常混乱。【参考方案2】:

您可以只使用len 函数。

if len(r) == 0 
    fmt.Println("No return value")            

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

如果您有一个返回不同长度数组的函数,请考虑使用切片,因为函数只能使用具有特定长度的数组返回类型声明(例如func f() [n]intn 是一个常量)并且该数组即使函数从不向该数组写入任何内容,其中也会有 n 个值(它们将被清零)。

【讨论】:

【参考方案3】:

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

len()

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

if len( yourFunction() ) == 0 
    // It implies that your array is empty.

【讨论】:

以上是关于如何检查空切片?的主要内容,如果未能解决你的问题,请参考以下文章

附加到作为空接口传递的 golang 切片

如何检查切片是不是在 Go 中具有给定索引?

Go 语言中的 nil 切片 vs 非 nil 切片 vs 空切片

检查两个切片的相等性

如何直接使用地图下载器(如太乐地图下载器)下载的google地图切片?

为啥可以将切片分配给空接口但不能将其强制转换为相同的空接口