如果初始化语句作用于内部if块,则golang.为什么?

por*_*ion -6 scope if-statement go

我在代码中发现了一个错误

func receive() (err error) {
    if v, err := produce(); err == nil {
        fmt.Println("value: ", v)
    }
    return
}
Run Code Online (Sandbox Code Playgroud)

错误永远不会从此函数返回,但我绝对相信它应该.

经过一些测试后,我明白err在if语句中重新声明了这一点.更重要的是 - 所有变量总是在短变量赋值内部if声明中重新声明,尽管它们之前被声明过.

这是工作代码

func receive() (err error) {
    v, err := produce()
    if err == nil {
        fmt.Println("value: ", v)
    }
    return
}
Run Code Online (Sandbox Code Playgroud)

这是一个例子:https://play.golang.org/p/1AWBsPbLiI1

好像if语句

//some code
if <init_statement>; <expression> {}
//more code
Run Code Online (Sandbox Code Playgroud)

相当于

//some code
{
    <init_statement>
    if expression {}
}
//more code
Run Code Online (Sandbox Code Playgroud)

所以,我的问题:

1)为什么不使用现有变量

2)为什么在文档/语言规范中没有提到这样的范围

3)为什么编译器不会说没有人返回值

Vol*_*ker 6

1)因为语言规范是这样说的.

2)它是:

每个"if","for"和"switch"语句都被认为是在其自己的隐式块中"

3)你确实在功能结束时返回了.不要使用命名返回值.