Как инициализировать глобальную переменную в go со значением, считанным из файла конфигурации во время выполнения - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь инициализировать глобальную переменную значением интервала, которое читается из файла конфигурации во время выполнения.

Файл конфигурации содержит набор пар ключ-значение. Как часть функции init (), с помощью синтаксического анализатора yaml значения анализируются и сохраняются в структуре.

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

Значения конфигурацииправильно заполнены в структуре.Ожидаемый результат - установить глобальную переменную со значением, считанным из файла.Но фактический результат равен 0. Фактический результат:

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

1 Ответ

0 голосов
/ 06 мая 2019

Вы уже выполнили сложную часть: глобальный Conf объект, для которого конфигурация YAML не распакована.Так что просто свяжись с ним напрямую:

// 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...