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

У меня есть глобальная переменная, которая читает файл конфигурации, который я использую в различных функциях.Когда я выполняю метод main и пытаюсь прочитать значение из конфигурации, оно еще не готово, поэтому я получаю странное значение :ᾐ, которое должно быть 8080. Как правильно ждать глобальное ожидание?Вар быть готовым.

var conf = getGeneralConfig()

func main() {
    router := mux.NewRouter()
    fmt.Println(":" + string(conf.PORT))
    router.HandleFunc("/add", add).Methods("POST")
   // conf is not yet ready here
    log.Fatal(http.ListenAndServe(":"+string(conf.PORT), router))
}

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Проблема заключается в преобразовании int в строку.Просто используйте пакет strconv для преобразования int значения в string как:

package main

import (
    "fmt"
    "strconv"
)

var conf = getGeneralConfig()

func getGeneralConfig() int {
    return 8080
}

func main() {
    //router := mux.NewRouter()
    fmt.Println(":" + strconv.Itoa(conf))
   // router.HandleFunc("/add", add).Methods("POST")
   // conf is not yet ready here
   // log.Fatal(http.ListenAndServe(":"+string(conf.PORT), router))
}

Check пример игровой площадки

0 голосов
/ 23 мая 2018

Переменная инициализируется до запуска main().Подробности см. В разделе инициализации пакета *1003* спецификации языка.

Проблема связана с преобразованием строки string(conf.PORT).Спецификация говорит это о преобразовании, используемом в приложении :

Преобразование целочисленного значения со знаком или без знака в строковый тип приводит к строке, содержащей целочисленное представление UTF-8.

Строка «ᾐ» - это кодировка руны 8080 в кодировке UTF-8. Исправление заключается в использовании strconv.Itoa

log.Fatal(http.ListenAndServe(":"+strconv.Itoa(conf.PORT), router))

или fmt.Sprintf для преобразования целого числа в десятичное представление

log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d",conf.PORT), router))

Более гибкий и простой подход заключается в указании полного адреса в виде строки в конфигурации.Это позволяет указывать IP-адрес в конфигурации.

0 голосов
/ 23 мая 2018

Инициализаторы глобальных переменных и пакетные функции init() всегда будут выполняться до main().Если ваша функция getGeneralConfig запускает программу, но вам необходимо выполнить ее до запуска main(), либо a) не используйте программу, либо b) используйте sync.WaitGroup, чтобы убедиться, что она завершенадо того, как getGeneralConfig вернется.

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