我有一个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项目中访问我想要的任何地方来调用此函数一次。
答案 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()
您正在将函数分配给变量而不是函数的结果。