如何在运行时与从配置文件读取的值一起初始化全局变量
问题描述:
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)
}