如何检查空切片?
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]int
,n
是一个常量)并且该数组即使函数从不向该数组写入任何内容,其中也会有 n 个值(它们将被清零)。
【讨论】:
【参考方案3】:可以使用Golang提供的内置函数
len()
它将帮助您轻松找到切片是否为空。
if len( yourFunction() ) == 0
// It implies that your array is empty.
【讨论】:
以上是关于如何检查空切片?的主要内容,如果未能解决你的问题,请参考以下文章
Go 语言中的 nil 切片 vs 非 nil 切片 vs 空切片