首页 > 解决方案 > golang if 初始化语句的范围为内部 if 块。为什么?

问题描述

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

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)为什么编译器不说没有人返回值

标签: if-statementgoscope

解决方案


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

2) 它是:

每个“if”、“for”和“switch”语句都被认为在其自己的隐式块中”

3)您确实在函数结束时返回。不要使用命名的返回值。


推荐阅读