如何在运行时与从配置文件读取的值一起初始化全局变量

如何在运行时与从配置文件读取的值一起初始化全局变量

问题描述:

I'm trying to initialize a global variable with an interval value which is read from a configuration file at run time.

The configuration file contains set of key-value pairs.As part of init() function, Using yaml parser the values are parsed and stored in a structure.

package main

import (
        "fmt"
        "io/ioutil"
        "time"
        yaml "gopkg.in/yaml.v2"
)

func init(){
        PopulateConfig("./test.config")
}

var Conf Config
var Interval = time.Second * Conf.Interval

type Config struct {
        Port     string        `yaml:"port"`
        Interval time.Duration `yaml:"interval"`
}

func PopulateConfig(filePath string) {
        data, err := ioutil.ReadFile(filePath)
        err = yaml.Unmarshal(data, &Conf)
        if err != nil {
        }
        fmt.Println("CONFIG => ", Conf)
}

func main() {
        // start timer
        fmt.Println("Inside main, Interval = ", Interval)
        purgeTicker := time.NewTicker(time.Second * 10)
        go Handle(purgeTicker)
        time.Sleep(60 * time.Second)

}

func Handle(ticker *time.Ticker) {
        fmt.Println("Inside Handle, Interval = ", Interval)
        for t := range ticker.C {
                fmt.Println("Calling purge timer at ", t)
                //Additional processing
        }
}

===========================

config file:
# cat test.config
port: 1234
interval: 15

The config values are populated correctly within the structure. Expected result is to set the global variable with the value read from file. But the actual output is 0. Actual Result:

# ./main
CONFIG =>  {1234 15ns}
Inside main, Interval =  0s
Inside Handle, Interval =  0s

You already have done the hard part: a global Conf object where the YAML config is unmarshaled to. So simply reference it directly:

// var Interval = time.Second * Conf.Interval // <- don't use this

// use Conf.Interval directly

func init() {
        PopulateConfig("./test.config")
        Conf.Interval = Conf.Interval * time.Second // convert to seconds here
}

func main() {
    fmt.Println("Inside main, Interval = ", Conf.Interval)
}

func Handle(ticker *time.Ticker) {
    fmt.Println("Inside Handle, Interval = ", Conf.Interval)
}

https://play.golang.org/p/FiheCtV2gtv