如何在简短的变量声明中从其他块中重新声明变量?
func f() (err os.Error) { proc, err := os.StartProcess(blah blah blah) // the new err masks the return value? }
关于此问题有很长的话题,但现在我很感兴趣如何解决此问题。
简短的变量声明的Go规范很明确:
短变量声明可以重新声明变量,只要它们最初是在同一块中以相同类型声明的,并且至少一个非空变量是新变量。
因此,在简短的变量声明中,您无法重新声明最初在其他块中声明的变量。
这是一个如何通过e在内部块中声明局部变量()并将其(e)分配给err2在外部块中声明的变量()来解决此限制的示例。
e
err2
package main import ( "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 directory f() err2: stat == e os.Error ==: no such file or directory
这是前面的示例,改写为使用显式正则变量声明和命名函数参数,而不是隐式短变量声明。变量声明始终可以显式地编写为常规变量声明或命名函数参数。隐式短变量声明只是常规变量声明的简写。
package main import ( "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 directory f() err2: stat == err2 os.Error ==: no such file or directory
在您的示例中,短变量声明errred重新声明了err; 的返回参数声明。他们在同一个街区。因此,新方法err不会屏蔽return参数err。
err