冲突的全局和局部变量名

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)
}