进行全局变量初始化

时间:2018-09-17 14:49:48

标签: go

在文件范围全局变量上加载配置的问题。

主要方法中的配置设置和加载配置值

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 没有初始化?

谢谢

2 个答案:

答案 0 :(得分:3)

每个the Go specification的执行顺序如下:

  

程序包初始化-变量初始化和init函数的调用-一次在单个goroutine中依次出现,一个程序包。初始化函数可以启动其他goroutine,这些goroutine可以与初始化代码同时运行。但是,初始化总是对init函数进行排序:在前一个函数返回之前,它不会调用下一个函数。

     

通过初始化主程序包然后调用函数main开始程序执行。当该函数调用返回时,程序退出。它不等待其他(非主)goroutine完成。

含义大致为:

  1. 全局变量已初始化
  2. init()函数运行
  3. main()运行

因此,main()才有机会进行全局初始化。

答案 1 :(得分:1)

x是在调用主方法或测试方法之前定义的,这意味着appConfig尚未初始化(因为appConfig是通过调用LoadConfig初始化的)。

为了使x可以按照您希望的方式进行初始化,您需要在执行main / test之前初始化appConfig。与其调用LoadConfig,不如想要一个类似的东西:

var appConfig = NewConfig()