英文:
Golang shadowing variable
问题
为什么在这段代码中变量'a'被遮蔽了?我在外部作用域中定义了它,然后在内部作用域中我必须使用':='语法为其赋予新值(来自函数调用的结果),因为我还需要一个新的变量'err'。但是这样会遮蔽'a',而且稍后在代码块外部,'a'会自动返回到初始值。
结果是:
here: inside WTF?
but here: outside
所以这迫使我在内部块中使用一个新变量,比如'b',然后将'b'赋值给'a',像这样?这样做很愚蠢,对吗?我觉得我在这里漏掉了什么。请帮忙解答。
func work() {
a := "outside"
{
b, err := foo()
a = b // 我不想这样做!!!
fmt.Printf("here: %v %v\n", a, err)
}
fmt.Printf("but here: %v \n", a)
}
英文:
Why in this code the variable 'a' is shadowed? I define it in outer scope, then, in the inner scope I have to use the ':=' syntax to assign a new value to it (result from a function call), because I also need to have the 'err' variable, which is new. But this shadows 'a', and later, outside the block, the 'a' returns automatically to the initial value.
package main
import (
"fmt"
)
func work() {
a := "outside"
{
a, err := foo()
fmt.Printf("here: %v %v\n", a, err)
}
fmt.Printf("but here: %v \n", a)
}
func foo() (string, error) {
return "inside", fmt.Errorf("WTF?")
}
func main() {
work()
}
The result is:
here: inside WTF?
but here: outside
So this forces me to use a new variable in the inner block, e.g. 'b', and then assign 'b' to 'a', like this? This would be stupid, wouldn't it? I feel like I am missing something here. Please help.
func work() {
a := "outside"
{
b, err := foo()
a = b // I DON'T WANT THIS !!!
fmt.Printf("here: %v %v\n", a, err)
}
fmt.Printf("but here: %v \n", a)
}
答案1
得分: 3
你正在使用短变量声明,这将重新声明外部作用域中的变量,从而遮蔽它们。你可以简单地声明错误变量,并使用常规赋值。
func work() {
a := "outside"
{
var err error
a, err = foo() // 没有遮蔽
}
fmt.Printf("但是这里:%v \n", a)
}
英文:
You are using short-form variable declaration, which will redeclare the variables in the outer scope, and thus, shadowing them. You can simply declare the error variable, and use regular assignment
func work() {
a := "outside"
{
var err error
a, err = foo() // No shadowing
}
fmt.Printf("but here: %v \n", a)
}
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论