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

时间:2015-01-04 10:07:32

标签: variables go

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

_, prs := m["example"]

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

prs := m["example"]

(我发现它是Go by Example: Maps

的一部分

8 个答案:

答案 0 :(得分:101)

它避免了必须为返回值声明所有变量 它被称为blank identifier

如:

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

other '_' use case is for import

由于它会丢弃返回值,因此当您只想检查其中一个返回值时会很有帮助,例如“How to test key existence in a map?”中显示的“Effective Go, map”:

_, present := timeZone[tz]
  

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

由于Jsor添加in the comments

  

“普遍接受的标准”是将成员资格测试变量称为“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
}

答案 1 :(得分:51)

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

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

上面的代码将返回一条错误消息"我声明并且未使用"。

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

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

我们使用它的一些地方:

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

答案 5 :(得分:1)

  

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

摘录自:

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

Brian W. Kernighan

此材料可能受版权保护。

答案 6 :(得分:1)

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

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

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

还可以在将来不希望函数的返回值时使用。

答案 7 :(得分:0)

  

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

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