全局变量名和局部变量名冲突

Nik*_*l H 3 scope go shadowing

这是有问题的代码片段:

package main

import (
    "fmt"
)

var a string = "hello"

func main() {
    b := "world"

    fmt.Println(a, b)

    a := "bye"

    fmt.Println(a, b)
}
Run Code Online (Sandbox Code Playgroud)

输出:

hello world
bye world
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何解决“全局”和“本地”变量之间的名称冲突a

更具体地说,我如何告诉 Goa使用哪个?

Har*_*ren 10

我认为您的原始示例很好地说明了这种情况。就像大多数编程语言一样,范围很重要。

最接近用途的范围决定了 的值a。因此,如果您:=在函数内重新声明 ( ) 变量,那么在该函数的持续时间内,您将拥有值"bye"

如果你选择对两件事使用相同的名字,结果是内在的名字总是占主导地位。如果您需要这两个值,则以不同的方式命名变量。

  • 有没有办法使用具有相同名称和不同作用域的两个变量? (2认同)

Grz*_*Żur 6

嗯,这并不是真正的解决方案,而是一种解决方法。在创建影子变量之前,您可以创建一个指向外部变量的指针。

var a string = "hello"

func main() {
    b := "world"

    fmt.Println(a, b)

    pa := &a
    a := "bye"

    fmt.Println(*pa, b, a)
}
Run Code Online (Sandbox Code Playgroud)