【问题标题】:Why would we use blank identifiers in Go?为什么我们要在 Go 中使用空白标识符?
【发布时间】:2017-09-12 17:28:30
【问题描述】:

我发现空白标识符的使用有点难以理解。我查看了effective go 并了解了他们描述的大多数用例,但随后查看了我在路由处理程序函数中遇到的教程:

var person Person
_ = json.NewDecoder(req.Body).Decode(&person)

在第一行中,我们创建了一个 Person 类型的新空变量(先前定义的结构),然后我假设

  • &person 正在通过引用传递 person var,
  • Decode函数填充数据

然后,此函数在编码并返回 json 响应之前继续执行更多任务。

为什么我们需要将解码分配给空白标识符?我们不能只运行json.NewDecoder(req.Body).Decode(&person) 吗?如果我们不能,为什么不呢?

【问题讨论】:

  • 那里不需要,但作者可能已经把它放在那里表明他们故意忽略错误值。
  • 好的,这样应用时,单个空白标识符是否会忽略所有返回分配?我认为它只会忽略其中一个,就像在不良做法的例子中一样,fi, _ := os.Stat(path)
  • 我不能诚实地投票结束这个问题。 OP 正在寻找对最佳实践的洞察。
  • 每个空白标识符只能分配一个东西,Decode 只返回一个值。忽略错误通常是不好的做法,但在某些情况下,错误根本无关紧要;无论如何,也许不解码任何东西都是错误的。我认为这里唯一真正的问题是代码中缺少 cmets。

标签: go


【解决方案1】:

空白标识符_ 也可用于严格提供结构中的键。参考this

不强制

type SomeStruct struct {
  FirstField string
  SecondField bool
}

myStruct := SomeStruct{"", false}

强制提及值的键(消除对值排序的依赖性)

type SomeSturct struct {
  FirstField string
  SecondField bool
  _ struct{}
}

// COMPILATION ERROR
myStruct := SomeSturct{"", false}

上面会报错too few values in SomeSturct literal

【讨论】:

  • 谢谢,虽然这提供了丰富的信息,但并没有具体说明所提出的问题。
  • 我同意,我是来看问题的标题的。以为我可以贡献一些东西,它会帮助某人
【解决方案2】:

我假设您正在学习 golang 并询问是因为您无法确定此示例为何使用这种做法。

正如@JimB 在 cmets 中提到的,示例编写者不需要这样做,他们只是忽略了错误返回。

【讨论】:

  • 这个答案包含的信息似乎比它引用的评论少。
  • 就是这样,这里的第一天菜鸟,根据我上面的评论,当这样应用时,一个空白标识符是否会忽略所有返回分配?我认为它只会忽略其中一个,例如有效 go fi, _ := os.Stat(path) 中的不良做法示例
  • @pushplaybang:这个问题和原来的问题都可以通过简单的尝试得到更快的回答。
猜你喜欢
  • 2012-11-19
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
相关资源
最近更新 更多