冲突的全局和局部变量名
Clashing global and local variable name
这里是有问题的代码片段:
package main
import (
"fmt"
)
var a string = "hello"
func main() {
b := "world"
fmt.Println(a, b)
a := "bye"
fmt.Println(a, b)
}
输出:
hello world
bye world
我的问题是,如何解决 "global" 和 "local" 变量之间的名称冲突 a
?
更具体地说,我如何告诉 Go 使用哪个 a
?
这称为变量阴影。
你只是给他们不同的名字。
你不能只要求 go 表现不同。
我认为你原来的例子很好地说明了这种情况。就像大多数编程语言一样,范围很重要。
最接近用途的范围决定 a
的值。因此,如果您在函数内重新声明 (:=
) 变量,那么在该函数运行期间,您将拥有值 "bye"
.
如果您选择对两件事使用相同的名称,结果是内部名称将始终占主导地位。如果您需要这两个值,则以不同的方式命名变量。
好吧,这不是真正的解决方案,而是一种解决方法。在创建阴影变量之前,您可以创建一个指向外部变量的指针。
var a string = "hello"
func main() {
b := "world"
fmt.Println(a, b)
pa := &a
a := "bye"
fmt.Println(*pa, b, a)
}
这里是有问题的代码片段:
package main
import (
"fmt"
)
var a string = "hello"
func main() {
b := "world"
fmt.Println(a, b)
a := "bye"
fmt.Println(a, b)
}
输出:
hello world
bye world
我的问题是,如何解决 "global" 和 "local" 变量之间的名称冲突 a
?
更具体地说,我如何告诉 Go 使用哪个 a
?
这称为变量阴影。 你只是给他们不同的名字。
你不能只要求 go 表现不同。
我认为你原来的例子很好地说明了这种情况。就像大多数编程语言一样,范围很重要。
最接近用途的范围决定 a
的值。因此,如果您在函数内重新声明 (:=
) 变量,那么在该函数运行期间,您将拥有值 "bye"
.
如果您选择对两件事使用相同的名称,结果是内部名称将始终占主导地位。如果您需要这两个值,则以不同的方式命名变量。
好吧,这不是真正的解决方案,而是一种解决方法。在创建阴影变量之前,您可以创建一个指向外部变量的指针。
var a string = "hello"
func main() {
b := "world"
fmt.Println(a, b)
pa := &a
a := "bye"
fmt.Println(*pa, b, a)
}