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