在golang中仅设置一次全局变量
我有一个main.go文件,其中包含:在golang中仅设置一次全局变量,go,Go,我有一个main.go文件,其中包含: // running the router in port 9000 func main() { router := routers.InitApp() router.RunTLS(":9000" , "domain.crt" , "domain.key") } 在另一个文件中,我有 package utils var ConfigMap = GetAppConfig func GetAppConfig() map[string]stri
// running the router in port 9000
func main() {
router := routers.InitApp()
router.RunTLS(":9000" , "domain.crt" , "domain.key")
}
在另一个文件中,我有
package utils
var ConfigMap = GetAppConfig
func GetAppConfig() map[string]string{
....//
}
ConfigMap是一个全局变量,每次我尝试访问utils.ConfigMap
map时,都会调用GetAppConfig
函数。如何在by app初始化时仅调用此函数一次,然后在go项目中访问任意所需的ConfigMap。这就是程序包函数的用途。它们执行一次,然后才能“从外部”到达您的包:
请注意,如果希望允许并发使用,则应保护此类导出的全局变量。将此问题留给包的用户是不可行的
为此,您应该声明ConfigMap
未报告:
var configMap[string]string
并提供一个getter函数,该函数将通过以下方式对其进行适当保护:
我相信你发布的代码中有一个输入错误。在init函数外部定义configMap,如下所示:
var configMap map[string]string
这很好,但在init中,您也有:
var configMap = map[string]string{}
在这里,您正在对init
函数外部的configMap进行阴影处理,这意味着您已经在init
函数内部再次声明了变量。因此,当您访问init
函数外部的变量时,您将得到仍然为空的全局变量。如果删除init
中的var
,它将正常工作
configMap = map[string]string{}
快速演示
原问题中还有一个拼写错误:
var configMap = GetAppConfig
这应该是:
var configMap = GetAppConfig()
您正在将函数分配给一个变量,而不是函数的结果。如何在init函数中声明?因此,变量声明(非导出)将在go文件中声明init函数和Config函数?然后要访问其他文件中的configMap变量,我们该怎么做?我无法执行utils.configMap Ithink@love2code是,在这种情况下,您无法访问
configMap
。但您可以使用config()
函数安全地查询任何配置值。当我运行应用程序时,configMap已完全初始化。但是稍后,当我在调用Config()函数时试图打印configMap时,它是空的。@love2code很可能您正在打印另一个映射,或者您没有同步对映射的访问。如果看不到更多代码,就无法判断。这是我的代码,在这个包之外的一个函数中,我执行x:=utils.Config(“key1”)fmt.Println(x)
var configMap = GetAppConfig
var configMap = GetAppConfig()