冲突全局和局部变量名称

时间:2017-12-03 23:07:02

标签: go scope shadowing

以下是相关代码段:

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

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

更具体地说,我如何告诉Go使用哪个a

3 个答案:

答案 0 :(得分:4)

我认为你原来的例子很好地说明了情况。就像大多数编程语言一样,范围很重要。

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

如果您选择对两件事使用相同的名称,结果是内部名称将始终占主导地位。如果您需要两个值,则以不同方式命名变量。

答案 1 :(得分:0)

这称为变量阴影。 你只需要用不同的名字命名

你不能只是要求采取不同的行为。

答案 2 :(得分:0)

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

var a string = "hello"

func main() {
    b := "world"

    fmt.Println(a, b)

    pa := &a
    a := "bye"

    fmt.Println(*pa, b, a)
}