在文件范围全局变量上加载配置的问题。
主要方法中的配置设置和加载配置值
func main() {
if err := config.LoadConfig(); err != nil {
logrus.Info("Unable to read config : ")
os.Exit(-1)
}
fmt.Println(config.GetConfig().Value) // print the correct value
service.Test() // prints 0
}
我的配置设置。 config.go
var appConfig AppConfig
func LoadConfig() error {
// loads config
appConfig = ....
}
func GetConfig() AppConfig {
return appConfig
}
我还有一个在service.go内部定义了全局变量的服务文件
var x = config.GetConfig().Value
func Test(){
fmt.Println(x)
}
问题:
为什么我的 service.go内部的全局变量x 没有初始化?
谢谢
答案 0 :(得分:3)
每个the Go specification的执行顺序如下:
程序包初始化-变量初始化和init函数的调用-一次在单个goroutine中依次出现,一个程序包。初始化函数可以启动其他goroutine,这些goroutine可以与初始化代码同时运行。但是,初始化总是对init函数进行排序:在前一个函数返回之前,它不会调用下一个函数。
通过初始化主程序包然后调用函数main开始程序执行。当该函数调用返回时,程序退出。它不等待其他(非主)goroutine完成。
含义大致为:
init()
函数运行main()
运行因此,main()
才有机会进行全局初始化。
答案 1 :(得分:1)
x
是在调用主方法或测试方法之前定义的,这意味着appConfig
尚未初始化(因为appConfig是通过调用LoadConfig
初始化的)。
为了使x可以按照您希望的方式进行初始化,您需要在执行main / test之前初始化appConfig。与其调用LoadConfig
,不如想要一个类似的东西:
var appConfig = NewConfig()