为了账号安全,请及时绑定邮箱和手机立即绑定

为什么可以在 Go 中的多个 return 语句中重新定义 err

为什么可以在 Go 中的多个 return 语句中重新定义 err

Go
Smart猫小萌 2021-11-29 16:11:55
考虑以下说明问题的示例(它只是为了解释问题而构建的,但我在书中也看到了类似的代码在实际项目中):package mainimport (    "strconv"    "fmt"    "log")func main() {    n1, err := strconv.Atoi("1")    if err != nil {        log.Panicf("%v", err)    }    n2, err := strconv.Atoi("2")    if err != nil {        log.Panicf("%v", err)    }    // err := fmt.Errorf("new error") <- line 1    // n1, err := strconv.Atoi("3") <- line 2    fmt.Printf("n1 = %d, n2 = %d\n", n1, n2)}编译器不会抱怨重新定义err,但如果我取消注释<- line 1或<- line 2,它会抱怨no new variable on left side of :=。那么它是怎样工作的?为什么编译器高兴地允许覆盖err多return语句,使用:=,而不是n1对<- line 2的例子吗?如果您可以指向解释此行为的官方参考,那就更好了。
查看完整描述

1 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

这是因为您使用了Short 变量声明 :=。引用规范:

与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初在同一块(如果块是函数体,则为参数列表)中先前声明的具有相同类型,并且至少有一个非变量是新的。因此,重新声明只能出现在多变量短声明中。重新声明不会引入新变量;它只是为原始值分配一个新值。

这一行:

n1, err := strconv.Atoi("1")

是一个多变量短声明,左边的所有变量都是新的,所以都会被声明(并返回strconv.Atoi()赋值的值)。

这一行:

n2, err := strconv.Atoi("2")

它是一个多变量短声明,并且n2是新的。所以它声明n2并且只为 分配一个新值err,因为err它已经在同一个块中声明了。

这一行:

err := fmt.Errorf("new error") <- line 1

不是多变量短声明。它会尝试声明err但它已经在同一个块中声明,因此它是一个编译时错误。

而这一行:

n1, err := strconv.Atoi("3") <- line 2

它是一个多变量的短声明,但是左边的所有变量之前都在同一个块中声明过,所以它也是一个编译时错误(它没有在左边引入任何新的变量)。

请注意,如果之前已声明左侧的所有变量,只需将 Short 变量声明更改:=Assignment 即可 =使其工作(假设右侧的值可分配给左侧的变量)。


查看完整回答
反对 回复 2021-11-29
  • 1 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信