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

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

_, prs := m["example"]

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

prs := m["example"]

(我发现它作为 例子: 地图的一部分)

67985 次浏览

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

例如:

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

这样,您就不必声明一个不会使用的变量: Go 不允许它。相反,使用’_’忽略该变量。

(其他的“ _”用例是用于导入的)

因为它丢弃了返回值,所以当您只想检查其中一个返回值时非常有用,如“ 有效,地图”中所示的“ 如何检测地图中的密钥存在?”:

_, 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 (_).
空白标识符可以用任何类型的任何值分配或声明,并且无害地丢弃该值。
为了测试映射中的存在,请使用空白标识符代替该值的通常变量。

正如 Jsor加上 在评论中:

“普遍接受的标准”是调用成员资格测试变量“ ok”(用于检查通道读取是否有效)

这样你就可以把它和测试结合起来:

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

你会发现它也在循环中:

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

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

_ is the blank identifier. Meaning the value it should be assigned is discarded.

这里是丢弃的 example键值。第二行代码将丢弃 存在布尔值并将值存储在 prs中。
因此,为了只检查映射中的存在,您可以丢弃该值。这可以用来将映射作为一个集合使用。

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

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

上面的代码将返回一个错误消息“ i 声明并未使用”。

因为在我们的循环中没有使用 i,所以我们需要将它改为:

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

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

我们使用它的一些地方:

  • A function returns a value and you don't intend to use it in the 未来
  • You want to iterate and need an i value that you will not be 使用

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

节选自:

The Go Programming Language (Addison-Wesley Professional Computing Series)

布莱恩·柯林汉

这种材料可能受版权保护。

未使用的变量在 Golang 是不允许的

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

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

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

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

当你将来不想要一个函数的返回值时,也可以使用它。

The great use case for the unused variable is the situation when you only need a partial output. In the example below we only need to print the value (state population).

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

_ (下划线)在 Golang 被称为空白标识符。标识符是用于标识目的的程序组件的用户定义的名称。Golang 有一个特殊的功能,可以使用空白标识符定义和使用未使用的变量。未使用的变量是那些由用户在整个程序中定义的变量,但他/她从不使用这些变量。 Go 编译器在遇到声明但未使用的变量时会抛出错误。现在我们可以简单地使用空白标识符,而不声明任何变量。

   // Golang program to show the compiler
// throws an error if a variable is
// declared but not used


package main


import "fmt"


// Main function
func main() {


// calling the function
// function returns two values which are
// assigned to mul and div identifier
mul, div := mul_div(105, 7)


// only using the mul variable
// compiler will give an error
fmt.Println("105 x 7 = ", mul)
}


// function returning two
// values of integer type
func mul_div(n1 int, n2 int) (int, int) {


// returning the values
return n1 * n2, n1 / n2
}

输出

./prog.go:15:7: div declared and not used

Let’s make use of the Blank identifier to correct the above program. In place of div identifier just use the _ (underscore). It allows the compiler to ignore declared and not used error for that particular variable.

    // Golang program to the use of Blank identifier


package main


import "fmt"


// Main function
func main() {


// calling the function
// function returns two values which are
// assigned to mul and blank identifier
mul, _ := mul_div(105, 7)


// only using the mul variable
fmt.Println("105 x 7 = ", mul)
}


// function returning two
// values of integer type
func mul_div(n1 int, n2 int) (int, int) {


// returning the values
return n1 * n2, n1 / n2
}

输出

105 x 7 =  735