代码之家  ›  专栏  ›  技术社区  ›  Karesh A

Go全局变量初始化

go
  •  -2
  • Karesh A  · 技术社区  · 6 年前

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

    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  
    
    }
    

    我的配置设置。配置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)
        }
    

    内部全局变量xservice.go 未初始化?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Community CDub    4 年前

    the Go specification

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

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

    所以你的全局初始化是在 有机会加载您的配置。

        2
  •  1
  •   Venantius    6 年前

    x appConfig 尚未初始化(因为appConfig是通过调用 LoadConfig

    为了使x能够以您希望的方式初始化,您需要在主/测试执行之前初始化appConfig。而不是打电话

    var appConfig = NewConfig()