冲突全局和局部变量名称

问题描述 投票:0回答:3

以下是相关代码段:

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

go scope shadowing
3个回答
4
投票

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

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

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


0
投票

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

你不能只是要求去表现不同。


0
投票

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

var a string = "hello"

func main() {
    b := "world"

    fmt.Println(a, b)

    pa := &a
    a := "bye"

    fmt.Println(*pa, b, a)
}
© www.soinside.com 2019 - 2024. All rights reserved.