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

时间:2019-03-01 23:48:28

标签: go package

我有以下代码:

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 Global Variable access的重复。

1 个答案:

答案 0 :(得分:-2)

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

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

import (
    "fmt"

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

这将使编译器知道它们实际上是同一程序包,因此将共享全局变量。

相关问题