我有以下代码:
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的重复。
答案 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"
)
这将使编译器知道它们实际上是同一程序包,因此将共享全局变量。