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

时间:2016-07-29 11:00:16

标签: go

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

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

在另一个gofile我有

package utils
var ConfigMap = GetAppConfig
func GetAppConfig() map[string]string{
 ....//
}

ConfigMap是一个全局变量,每当我尝试访问utils.ConfigMap映射时,都会调用GetAppConfig函数。如何通过app初始化然后在go项目中访问我想要的任何地方来调用此函数一次。

2 个答案:

答案 0 :(得分:14)

这是init()个函数包的用途。它们被执行一次,然后才能从外部"

到达您的包裹
var ConfigMap map[string]string

func init() {
    // Init ConfigMap here
}

请注意,如果要允许并发使用,则应保护此类导出的全局变量。把它留给包裹的使用者是不可行的。

为此,您应声明ConfigMap未导出:

var configMap[string]string

并提供一个getter函数,可以使用Mutex

正确保护它
var confMux = &sync.Mutex{}

func Config(name string) string {
    confMux.Lock()
    defer confMux.Unlock()
    return configMap[name]
}

答案 1 :(得分:0)

我相信您发布的代码中存在拼写错误。您可以在init函数之外定义configMap,如下所示:

var configMap map[string]string

这很好但是在init中你也有这个:

var configMap = map[string]string{}

在这里,您将隐藏在init函数之外的configMap,这意味着您已在init内再次声明了该变量。因此,当您访问init函数之外的变量时,您将获得仍为空的全局变量。如果您移除var内的init,则可以正常使用。

configMap = map[string]string{}

Here's快速演示。

原始问题还有另一个错字:

var configMap = GetAppConfig

这应该是:

var configMap = GetAppConfig()

您正在将函数分配给变量而不是函数的结果。