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

我有以下代码:


主要去:


package main


import (

    "fmt"


    "./globalvar"


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

)


func main() {

    globalvar.GlobalNum = 42

    fmt.Println(globalvar.GlobalNum)

    usevar.PrintGlobal()

}

使用变量/使用变量.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的副本。



慕标5832272
浏览 73回答 1
1回答

沧海一幻觉

发生这种情况的原因是因为我们混合了相对和远程导入。在 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")这将使编译器知道它们实际上是同一个包,因此将共享全局变量。
打开App,查看更多内容
随时随地看视频慕课网APP