猿问

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

考虑以下说明问题的示例(它只是为了解释问题而构建的,但我在书中也看到了类似的代码在实际项目中):


package main


import (

    "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的例子吗?


如果您可以指向解释此行为的官方参考,那就更好了。


Smart猫小萌
浏览 134回答 1
1回答

暮色呼如

这是因为您使用了Short 变量声明&nbsp;:=。引用规范:与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初在同一块(如果块是函数体,则为参数列表)中先前声明的具有相同类型,并且至少有一个非空变量是新的。因此,重新声明只能出现在多变量短声明中。重新声明不会引入新变量;它只是为原始值分配一个新值。这一行:n1,&nbsp;err&nbsp;:=&nbsp;strconv.Atoi("1")是一个多变量短声明,左边的所有变量都是新的,所以都会被声明(并返回strconv.Atoi()赋值的值)。这一行:n2,&nbsp;err&nbsp;:=&nbsp;strconv.Atoi("2")它是一个多变量短声明,并且n2是新的。所以它声明n2并且只为 分配一个新值err,因为err它已经在同一个块中声明了。这一行:err&nbsp;:=&nbsp;fmt.Errorf("new&nbsp;error")&nbsp;<-&nbsp;line&nbsp;1它不是多变量短声明。它会尝试声明err但它已经在同一个块中声明,因此它是一个编译时错误。而这一行:n1,&nbsp;err&nbsp;:=&nbsp;strconv.Atoi("3")&nbsp;<-&nbsp;line&nbsp;2它是一个多变量的短声明,但是左边的所有变量之前都在同一个块中声明过,所以它也是一个编译时错误(它没有在左边引入任何新的变量)。请注意,如果之前已声明左侧的所有变量,只需将 Short 变量声明更改:=为Assignment 即可&nbsp;=使其工作(假设右侧的值可分配给左侧的变量)。
随时随地看视频慕课网APP

相关分类

Go
我要回答