【发布时间】:2018-08-28 09:44:27
【问题描述】:
我在我的代码中发现了一个错误
func receive() (err error) {
if v, err := produce(); err == nil {
fmt.Println("value: ", v)
}
return
}
这个函数永远不会返回错误,但我绝对确定它应该返回。
经过一些测试,我了解到err 在 if 语句中被重新声明。不仅如此 - 所有变量总是在 if 语句中的短变量赋值中重新声明,尽管它们之前已声明过。
这是工作代码
func receive() (err error) {
v, err := produce()
if err == nil {
fmt.Println("value: ", v)
}
return
}
这里是一个例子:https://play.golang.org/p/1AWBsPbLiI1
好像是if语句
//some code
if <init_statement>; <expression> {}
//more code
等价于
//some code
{
<init_statement>
if expression {}
}
//more code
所以,我的问题:
1) 为什么不使用现有变量
2) 为什么文档/语言规范中未提及此类范围
3) 为什么编译器不说没有人返回值
【问题讨论】:
-
1) 因为您要声明新的 2) 这实际上很有趣 - 我也不容易找到 3) 您返回一个值 - 这是
error类型的默认值 - @ 987654329@
标签: if-statement go scope