【问题标题】:Clashing global and local variable name冲突的全局和局部变量名
【发布时间】:2017-12-03 23:07:02
【问题描述】:

这里是有问题的代码sn-p:

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

【问题讨论】:

  • 等等,这不是“冲突”,而是所谓的“阴影”。您是否在问 main 内部的代码是否可以引用全局 a,即使内部 a 正在隐藏(隐藏)它?
  • 顺便说一句,这可能会有所帮助:developmentality.wordpress.com/2014/03/03/…(通过谷歌搜索“golang shadow”找到它)
  • 如果您想更改全局变量的值,只需执行 a = "bye" 而不是 a := "bye"
  • @RayToal 是的,这就是我所要求的,但从下面的答案看来,这可能是不可能的。
  • 在许多其他编程语言中都是可能的(例如,C++ 有 ::,Ada 有 subprogram.name),但 Go 似乎没有办法做到这一点。

标签: go scope shadowing


【解决方案1】:

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

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

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

【讨论】:

  • 有没有办法同时使用同名和不同作用域的两个变量?
  • 没有。变量按名称引用。如果两个名称相同,您将只能在任何给定范围内引用其中一个。
【解决方案2】:

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

var a string = "hello"

func main() {
    b := "world"

    fmt.Println(a, b)

    pa := &a
    a := "bye"

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

【讨论】:

    【解决方案3】:

    这称为变量阴影。 您只是以不同的方式命名它们。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多