【问题标题】:What is "_," (underscore comma) in a Go declaration?Go 声明中的“_”(下划线逗号)是什么?
【发布时间】:2015-03-02 02:22:35
【问题描述】:

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

_, prs := m["example"]

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

prs := m["example"]

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

【问题讨论】:

  • 对于未来的语言问题,请先查看spec。它应该回答你所有的问题。
  • 作为评论:prs 可能代表“现在”。您示例中的代码正在检查 "example" 映射中是否存在 "example" 条目。
  • @FUZxxl 是的,我以前看过那里,但由于我不知道该功能的名称,所以我没有找到它。此外,我发现编程语言的官方规范不是很有教学性,而是通过示例学习。
  • @dyoo 一旦我得到了下面的解释,我就明白了它的含义,但值得注意的是如果其他人有同样的问题!
  • @FUZxxl:我不知道。在 SO 上提出的大多数问题可能在某处有可用的答案。存在一些阈值,低于该阈值可能不应该提出问题,但我认为这个问题不低于该阈值。

标签: variables go


【解决方案1】:

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

如:

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

这样,您不必声明不会使用的变量:Go 不允许这样做。相反,使用 '_' 忽略所述变量。

(other '_' use case is for import)

由于它会丢弃返回值,因此当您只想检查一个返回值时会很有帮助,如“Effective Go, map”中所示的“How to test key existence in a 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
}

【讨论】:

  • 感谢您提供了一个很好的例子。我花了一些时间来理解这个概念,但现在我明白了!
  • 请注意,IME“普遍接受的标准”是调用成员资格测试变量“ok”(同样用于检查通道读取是否有效)。
  • @Jsor 我同意。我已将您的评论包含在答案中以获得更多可见性,并添加了一些其他示例。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        摘自:

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

        布赖恩·W·克尼汉

        此材料可能受版权保护。

        【讨论】:

          【解决方案6】:

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

          我们使用它的一些地方:

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

          【讨论】:

            【解决方案7】:

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

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

            上面的代码会返回一个错误信息“我声明并且没有使用”。

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

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

            【讨论】:

            • 您的第一句话对于理解将 _ 作为空白标识符的原因很重要。
            【解决方案8】:

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

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

            【讨论】:

              猜你喜欢
              • 2010-09-18
              • 2016-07-24
              • 2021-08-11
              • 1970-01-01
              • 2013-07-13
              • 1970-01-01
              • 2011-11-16
              • 1970-01-01
              相关资源
              最近更新 更多