如何跨所有包一个全局变量访问在golang

问题描述:

我有具有main.go文件:如何跨所有包一个全局变量访问在golang

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

在router.InitMap我要声明,可在我的应用程序访问的全局变量任何地方。有可能吗?我试过

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


} 

但是即使在同一个软件包中,我也可以访问变量Global

+0

你为什么想这么做?你将很难测试的东西。 – ale64bit

+0

我想在应用程序启动时为应用程序获取配置数据。这是通过一个rest API返回的。例如:数据库主机名,用户名等。 – aaj

+1

然后首先在函数'InitApp'之外声明变量:'var Global string',然后在准备就绪时为其分配一个值。 – ale64bit

在顶层声明变量 - 的任何功能以外:

var Global = "myvalue" 

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

} 

由于变量的名称以大写字母开头,变量将在当前包既可以通过其名称 - 以及在导入定义变量的包时使用包名进行限定的任何其他包中,如:return packagename.Global

这里的另一个例证(也转到操场:https://play.golang.org/p/h2iVjM6Fpk):

package main 

import (
    "fmt" 
) 

var greeting = "Hello, world!" 

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

参见围棋之旅: “变量” https://tour.golang.org/basics/8和 “导出名称” https://tour.golang.org/basics/3

+0

我注意到,如果我从函数的返回值中获取全局变量。每次调用这个函数。对于如:'VAR全球= InitApp FUNC InitApp()(字符串){VAR 环球= “myvalue的” 回报全球 }'每次我尝试访问全局,InitApp被调用。无论如何,我可以避免这种情况吗?我希望全局变量只被提取一次。 – aaj

+0

确保使用()调用该函数,例如:var Global = InitApp()有关可运行示例,请参阅https://play.golang.org/p/jdsFqFVxVi。 – dmitris