关于变量:Go声明中的“_,”(下划线逗号)是什么?

What is “_,” (underscore comma) in a Go declaration?

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

1
_, prs := m["example"]

"_,"究竟在做什么,为什么要声明这样的变量而不是

1
prs := m["example"]

(我发现它是Go-by示例:地图的一部分)


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

如:

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

(另一个'EDOCX1[0]用例用于导入)

因为它会丢弃返回值,所以当您只想检查返回值中的一个时,它会很有帮助,如"如何测试映射中的键存在性?"如"有效行动,地图"所示:

1
_, present := timeZone[tz]

To test for presence in the map without worrying about the actual value, you can use the blank identifier, a simple underscore (_).
The blank identifier can be assigned or declared with any value of any type, with the value discarded harmlessly.
For testing presence in a map, use the blank identifier in place of the usual variable for the value.

正如JSOR在注释中所补充的:

"generally accepted standard" is to call the membership test variables"ok" (same for checking if a channel read was valid or not)

这允许您将它与测试结合起来:

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

你会发现它也在循环中:

If you only need the second item in the range (the value), use the blank identifier, an underscore, to discard the first:

1
2
3
4
sum := 0
for _, value := range array {
    sum += value
}


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

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

上述代码将返回错误消息"I declared and not used"。

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

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


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

这里是丢弃的example键的值。第二行代码将丢弃存在布尔值并将值存储在prs中。因此,要只检查地图中的存在,可以放弃该值。这可用于将地图用作集合。


基本上,EDCOX1×5称为空白标识符。在Go中,不能有未使用的变量。

作为一个实例,在迭代数组时,如果使用值:=range,则不希望使用i值进行迭代。但如果省略i值,它将返回一个错误。但是如果你声明我没有使用它,它也会返回一个错误。

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

另外,当您将来不需要函数的返回值时,也可以使用它。


The blank identifier may be used whenever syntax requires a variable name but program logic does not, for instance to discard an unwanted loop index when we require only the element value.

摘录:

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

程序设计实践

本材料可能受版权保护。


它被称为空白标识符,它在您希望放弃要返回的值而不引用它的情况下是有用的。

我们使用它的一些地方:

  • 函数返回一个值,而您不打算在未来
  • 您希望迭代并需要一个不需要的i值使用


An unused variable is not allowed in Golang

如果您来自其他编程语言,可能会感到有点难以适应这一点。但这会导致代码更加清晰。所以通过使用_,我们说我们知道这里有一个变量,但是我们不想使用它,并且告诉编译器不要抱怨它。:)