简短的变量声明的Go规范很明确:
短变量声明可以重新声明变量,只要它们最初是在同一块中以相同类型声明的,并且至少一个非空变量是新变量。
因此,在简短的变量声明中,您无法重新声明最初在其他块中声明的变量。
这是一个如何通过
e在内部块中声明局部变量()并将其(
e)分配给
err2在外部块中声明的变量()来解决此限制的示例。
package mainimport ( "fmt" "os")func f() (err1 os.Error, err2 os.Error) { fi, err1 := os.Stat("== err1 os.Error ==") _ = fi { fi, e := os.Stat("== e os.Error ==") _ = fi err2 = e } return}func main() { err1, err2 := f() fmt.Println("f() err1:", err1) fmt.Println("f() err2:", err2)}输出:
f() err1: stat == err1 os.Error ==: no such file or directoryf() err2: stat == e os.Error ==: no such file or directory
这是前面的示例,改写为使用显式正则变量声明和命名函数参数,而不是隐式短变量声明。变量声明始终可以显式地编写为常规变量声明或命名函数参数。隐式短变量声明只是常规变量声明的简写。
package mainimport ( "fmt" "os")func f() (err1 os.Error, err2 os.Error) { var fi *os.FileInfo fi, err1 = os.Stat("== err1 os.Error ==") _ = fi { var fi *os.FileInfo fi, err2 = os.Stat("== err2 os.Error ==") _ = fi } return}func main() { err1, err2 := f() fmt.Println("f() err1:", err1) fmt.Println("f() err2:", err2)}输出:
f() err1: stat == err1 os.Error ==: no such file or directoryf() err2: stat == err2 os.Error ==: no such file or directory
在您的示例中,短变量声明
errred重新声明了
err; 的返回参数声明。他们在同一个街区。因此,新方法
err不会屏蔽return参数
err。



