如何在短变量声明中重新声明来自不同块的变量?
func f() (err os.Error) {
proc, err := os.StartProcess(blah blah blah)
// the new err masks the return value?
}
关于此问题有一个long thread和issue,但我对如何解决此问题感兴趣。
答案 0 :(得分:1)
short variable declarations的Go规范很明确:
短变量声明可以 他们提供的重新声明变量 最初在同一个街区宣布 具有相同的类型,至少有一个 非空白变量是新的。
因此,在很短的变量声明,则不能重新声明最初在不同的块中声明的变量。
以下是如何通过声明在内部块的局部变量(e
),并将其(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
下面是前面的例子改写为使用显式规则variable declarations和{命名{3}}而不是隐式function parameters。变量声明总是可以显式写为常规变量声明或命名函数参数;隐式短变量声明只是常规变量声明的简写。
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
在你的例子,短变量声明err
redeclares的err
的返回参数声明;他们在同一个街区。因此,新err
不会屏蔽返回参数err
。
答案 1 :(得分:0)
无法绕过:=
声明的范围规则。只需明确使用var
和=
。