如何检查空片?


72

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

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

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

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

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

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


4
Go不是javascript!阅读基础知识:golang.org/doc/effective_go.html
Endre Simo

6
更多的事情-首先-数组不是切片。数组是类型,具有固定数量的元素,因此问题仅对切片有意义。其次-如果您初始化这些切片,它将不起作用。第三-如果len(a)== 0呢?
lofcek '16

解决方法可以编译吗?除非r也是类型,否则我看不到它会如何,[0]int但在那种情况下,两个(空)数组将始终比较相等。
Paul Hankin

@PaulHankin是的,它确实起作用。函数的返回类型为int []
Kshitiz Sharma

Answers:


99

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

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

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

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

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

3
这种方法的问题在于,刚刚声明的切片(例如var num []int)也将len返回为零。即,len(num) == 0
nawazish-stackoverflow

13

您可以只使用该len功能。

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

尽管由于使用的是数组,所以类型[0]int的数组(大小为0的int数组)与(大小为[n]intn的int的n数组)不同,并且彼此不兼容。

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


4

您可以使用Golang提供的内置功能

len()

这将帮助您轻松地找到一个切片是否为空。

if len( yourFunction() ) == 0 {
    // It implies that your array is empty.
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.