为什么我的全局变量没有跨包设置?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (88)

这个问题在这里已有答案:

我有以下代码:

main.go:

package main

import (
    "fmt"

    "./globalvar"

    "github.com/Denton-L/gotest/usevar"
)

func main() {
    globalvar.GlobalNum = 42
    fmt.Println(globalvar.GlobalNum)
    usevar.PrintGlobal()
}

usevar / usevar.go:

package usevar

import (
    "fmt"

    "github.com/Denton-L/gotest/globalvar"
)

func PrintGlobal() {
    fmt.Println(globalvar.GlobalNum)
}

globalvar / globalvar.go:

package globalvar

var GlobalNum int

我正在编译go build main.go。当我调用./main,我明白了

42
0

作为输出,应该是这样的:

42
42

为什么会这样?

编辑:请注意,我能够访问全局变量,但它们包含意外值,因此这不是Golang全局变量访问的重复。

提问于
用户回答回答于

发生这种情况的原因是因为我们正在混合相对和远程进口。在main.go中,globalvar包被导入为,./globalvar但usevar / usevar.go将其导入为github.com/Denton-L/gotest/globalvar。因此,Go认为这些是具有自己的命名空间的独立包,因此,它们有自己独立的全局变量,恰好相同地命名。

为了解决这个问题,将相对导入更改为远程导入,因此main.go import语句应如下所示:

import (
    "fmt"

    "github.com/Denton-L/gotest/globalvar"
    "github.com/Denton-L/gotest/usevar"
)

这将让编译器知道它们实际上是相同的包,因此,全局变量将被共享。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励