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

aaj*_*aaj 6 go

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

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

在我的另一个gofile

package utils
var ConfigMap = GetAppConfig
func GetAppConfig() map[string]string{
 ....//
}
Run Code Online (Sandbox Code Playgroud)

ConfigMap是一个全局变量,每次我尝试访问utils.ConfigMapmap时GetAppConfig都会调用该函数.如何通过应用程序初始化然后在go项目中访问任何我想要的ConfigMap,我只能调用此函数一次.

icz*_*cza 14

这是包init()功能的用途.在"从外部"到达您的包裹之前,它们会被执行一次:

var ConfigMap map[string]string

func init() {
    // Init ConfigMap here
}
Run Code Online (Sandbox Code Playgroud)

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

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

var configMap[string]string
Run Code Online (Sandbox Code Playgroud)

并提供一个getter功能,可以通过以下方式正确保护它Mutex:

var confMux = &sync.Mutex{}

func Config(name string) string {
    confMux.Lock()
    defer confMux.Unlock()
    return configMap[name]
}
Run Code Online (Sandbox Code Playgroud)