考虑以下说明问题的示例(它只是为了解释问题而构建的,但我在书中也看到了类似的代码在实际项目中):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 即可 =
使其工作(假设右侧的值可分配给左侧的变量)。
- 1 回答
- 0 关注
- 133 浏览
添加回答
举报
0/150
提交
取消