我有以下代码:
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的副本。
发布于 2019-03-02 07:53:34
之所以会发生这种情况,是因为我们混合了相对导入和远程导入。在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"
)
这将让编译器知道它们实际上是相同的包,因此,全局变量将被共享。
https://stackoverflow.com/questions/54953841
复制相似问题