【问题标题】: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[]

标签: go slice


【解决方案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.
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-13
      • 2018-12-18
      • 1970-01-01
      • 2012-08-09
      • 2017-11-27
      • 2015-12-15
      • 2013-02-25
      • 2019-07-05
      相关资源
      最近更新 更多