Go声明中的“ _”(下划线逗号)是什么?


100

而且我似乎无法理解这种变量声明:

_, prs := m["example"]

到底在_,做什么,为什么他们这样声明变量而不是

prs := m["example"]

(我发现它是Go by Example:Maps的一部分


3
对于将来的语言问题,请先查看规格。它应该回答您所有的问题。
2015年

作为评论:prs可能代表“现在”。在你的例子的代码检查一个条目的存在或不存在"example"m地图。
dyoo

6
@FUZxxl是的,我之前在那里看过,但是由于我不知道该功能的名称,所以没有找到它。我也发现编程语言的官方规范不是非常教学法,而是通过实例学习。
坎苏勒2015年

@dyoo一旦有了下面的解释,我便知道了它的意思,但值得注意的是,其他人是否有相同的问题!
Kansuler

8
@FUZxxl:我不知道。在SO上提出的大多数问题都可能在某个地方有答案存在一些阈值,在这个阈值之下可能不应该提出一个问题,但是我不认为这个问题在此之下。
2016年

Answers:


120

它避免了必须为返回值声明所有变量。
它称为空白标识符

如:

_, y, _ := coord(p)  // coord() returns three values; only interested in y coordinate

另一个' _'用例用于导入

由于它丢弃了返回值,因此在您只想检查返回的值之一时很有用,例如“ Effecture Go,map ”中所示的“ 如何测试映射中键的存在? ”:

_, present := timeZone[tz]

要在地图中测试是否存在而不必担心实际值,可以使用空白标识符,即简单的下划线(_)。
可以使用任何类型的任何值来分配或声明空白标识符,并且可以无害地丢弃该值。
要在地图中测试状态,请使用空白标识符代替常规变量的值。

正如Jsor 在评论中添加

“通常接受的标准”是将成员资格测试变量称为“ ok”(与检查通道读取是否有效相同)

这使您可以将其与测试结合使用:

if _, err := os.Stat(path); os.IsNotExist(err) {
    fmt.Printf("%s does not exist\n", path)
}

您还会在循环中找到它:

如果只需要范围(值)中的第二项,则使用空白标识符(下划线)来丢弃第一项:

sum := 0
for _, value := range array {
    sum += value
}

感谢您提供一个很好的例子。我花了一些时间才能理解这个概念,但是现在我知道了!
Kansuler,2015年

请注意,IME“通常接受的标准”是将成员资格测试变量称为“ ok”(与检查通道读取是否有效相同)。
LinearZoetrope 2015年

1
@Jsor,我同意。我将您的评论包含在答案中以提高可见性,并添加了一些其他示例。
VonC

63

Go编译器不允许您创建从未使用过的变量。

for i, value := range x {
   total += value
}

上面的代码将返回错误消息“我已声明并且未使用”。

由于我们不在循环中使用i,因此需要将其更改为:

for _, value := range x {
   total += value
}

12
您的第一句话对于理解使用_作为空白标识符的原因很重要。
塔里克

4

_是空白标识符。意味着应该分配的值将被丢弃。

这是example被丢弃的密钥的值。第二行代码将舍弃状态布尔值,并将值存储在中prs
因此,仅检查地图中的存在,可以丢弃该值。这可用于将地图用作集合。


3

每当语法要求变量名但程序逻辑不需要变量名时,就可以使用空白标识符,例如,当我们仅要求元素值时,丢弃不需要的循环索引。

摘录自:

Go编程语言(Addison-Wesley专业计算系列)

布莱恩·W·克尼根(Brian W.

该材料可能受版权保护。


2

它称为空白标识符,在您希望丢弃将要返回的值而不参考它的情况下,它会有所帮助

我们使用它的一些地方:

  • 函数返回一个值,您将来不打算使用它
  • 您想迭代并需要一个不会使用的i值

2

未使用变量的最佳用例是只需要部分输出的情况。在下面的示例中,我们只需要打印值(州人口)。

package main
import (
    "fmt"
)
func main() {
          statePopulations := map[string]int{
          "California": 39250017,
          "Texas":      27862596,
          "Florida":    20612439,
          }
          for _, v := range statePopulations {
          fmt.Println(v)
    }
}

1

基本上_,称为空白标识符。在GO中,我们不能有未使用的变量。

作为实例,如果使用value:= range遍历数组,则不需要i值进行迭代。但是,如果省略i值,它将返回错误。但是,如果您声明i而不使用它,它也会返回一个错误。

因此,这是我们必须使用的地方_,

当您将来不希望函数的返回值时,也可以使用它。


0

Golang中不允许使用未使用的变量

如果您来自其他编程语言,可能很难适应这一点。但这会导致代码更简洁。因此,通过使用a,_我们是说我们知道那里有一个变量,但我们不想使用它,并告诉编译器不要抱怨我。:)

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.