Идти инициализация глобальной переменной - PullRequest
0 голосов
/ 17 сентября 2018

Ошибка при загрузке конфигурации для глобальной переменной области файла.

Настройка конфигурации и загрузка значений конфигурации в методе main

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  

}

Настройка моей конфигурации.config.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)
    }

Вопрос:

Почему моя глобальная переменная xвнутри service.go не инициализируется?

Спасибо

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Per спецификация Go , порядок выполнения следующий:

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

Выполнение программы начинается с инициализации основного пакета и последующего вызова функции main.Когда этот вызов функции возвращается, программа завершается.Он не ожидает завершения других (не основных) подпрограмм.

Значение порядка примерно:

  1. Глобальные переменные инициализируются
  2. init() функции выполняются
  3. main() выполняются

Таким образом, ваша глобальная инициализация происходит до того, как main() сможет загрузить вашу конфигурацию.

0 голосов
/ 17 сентября 2018

x определяется до того, как будут вызваны ваши основные или тестовые методы, что означает, что appConfig еще не инициализирован (так как appConfig инициализируется вызовом LoadConfig).

Для того чтобы x мог инициализироваться так, как вам нужно, вам нужно инициализировать appConfig перед выполнением main / test. Вместо того, чтобы звонить LoadConfig, вам нужно иметь что-то вроде:

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