这是因为你使用了短变量声明 https://golang.org/ref/spec#Short_variable_declarations :=
。引用规范:
与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初在同一块(或参数列表,如果该块是函数体)中以相同的类型声明,并且至少有一个非blank https://golang.org/ref/spec#Blank_identifier变量是新的。作为结果,重新声明只能出现在多变量短声明中。重新声明不会引入新变量;它只是为原始值分配一个新值。
这行:
n1, err := strconv.Atoi("1")
是一个多变量短声明,左侧的所有变量都是新的,因此所有变量都会被声明(并返回值strconv.Atoi()
分配)。
这行:
n2, err := strconv.Atoi("2")
它是一个多变量简短声明,并且n2
是新的。所以它声明n2
并且只分配一个新值err
, 因为err
已在同一块中声明。
这行:
err := fmt.Errorf("new error") <- line 1
It is not多变量简短声明。它会尝试声明err
但它已经在同一个块中声明,因此这是一个编译时错误。
还有这一行:
n1, err := strconv.Atoi("3") <- line 2
这是一个多变量的简短声明,但是所有变量左侧已先前宣布的在同一个块中,所以它也是一个编译时错误(它不会在左侧引入任何新变量)。
请注意,如果左侧的所有变量都已声明过,则只需从 Short 变量声明更改即可:=
to 任务 https://golang.org/ref/spec#Assignments =
将使其工作(假设右侧的值为可分配的 https://golang.org/ref/spec#Assignability到左侧的变量)。