在golang中仅设置一次全局变量

在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

我有一个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]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()