如何在golang中的所有包中访问全局变量

aaj*_*aaj 20 go

我有一个main.go文件,其中包含:

// running the router in port 9000
func main() {
    router,Global := routers.InitApp()
    fmt.println(Global)
    router.RunTLS(":9000" , "domain.crt" , "domain.key")
}
Run Code Online (Sandbox Code Playgroud)

在router.InitMap中我想声明一个全局变量,可以在我的应用程序的任何地方访问它.有可能吗?我试过了

func InitApp() (*gin.Engine,string) {
        var Global= "myvalue"           
        router := gin.New()
        return router,Global


}
Run Code Online (Sandbox Code Playgroud)

router.InitMap即使在同一个包中,我也可以访问该变量.

dmi*_*ris 25

在顶层声明一个变量 - 在任何函数之外:

var Global = "myvalue"

func InitApp() (string) {
        var Global= "myvalue"
        return Global

}
Run Code Online (Sandbox Code Playgroud)

由于变量的名称以大写字母开头,变量将可无论是在通过它的名字当前包-在任何其他包,当您导入程序包中定义的变量,并与包名限定它为:return packagename.Global.

这是另一个例子(也在Go游乐场:https://play.golang.org/p/h2iVjM6Fpk):

package main

import (
    "fmt"
)

var greeting = "Hello, world!"

func main() {
    fmt.Println(greeting)
}
Run Code Online (Sandbox Code Playgroud)

另见Go Tour:"Variables" https://tour.golang.org/basics/8和"Exported names" https://tour.golang.org/basics/3.

  • 对我来说,“主包”中的导出(全局)变量无法从其他包访问。但同时,可以从 main (`packagename.VariableName`) 访问包中导出的变量 (3认同)

Rom*_*kin 9

最好使用 init 函数来初始化全局变量。即使在这个包的多个包含中,它也只会被处理一次。https://play.golang.org/p/0PJuXvWRoSr

package main

import (
        "fmt"
)

var Global string 

func init() { 
        Global = InitApp()
}

func main() {
    fmt.Println(Global)
}

func InitApp() (string) {
        return "myvalue"
}
Run Code Online (Sandbox Code Playgroud)