Мы обнаружили, что использование переменных среды - один из самых простых и гибких методов настройки приложений Golang. Их можно использовать повсюду в вашем приложении и настраивать на терминале, в сценарии оболочки, используя такие инструменты, как Docker или Kubernetes, а также устанавливать или изменять внутри приложения. Вот простой пример того, как вы могли бы их использовать:

package main
import (
    "log"
    "net/http"
    "os"
)
func main() {
    dir := os.Getenv("SERVER_DIR")
    host := os.Getenv("SERVER_HOST")
    // defaults
    if dir == "" {
        dir = "/www/"
    }
    if host == "" {
        host = "localhost:8080"
    }
    http.Handle("/", http.FileServer(http.Dir(dir)))
    log.Fatal(http.ListenAndServe(host, nil))
}

В этом примере мы запускаем простой статический файловый сервер HTTP. Используются две переменные конфигурации, dir и host. Оба считываются из переменных среды и устанавливаются на какое-то значение по умолчанию, если оно отсутствует. Для настройки и запуска сервера мы создаем сценарий оболочки (например, start.sh):

export SERVER_DIR=/www/mywebsite/
export SERVER_HOST=0.0.0.0:80
go run main.go

И раскрутите его, запустив ./start.sh.

Легко, правда? Что ж, как только у нас будет много этих переменных, распределенных по нашему приложению, мы, вероятно, потеряем из виду, что, где и как настраивается. По этой причине мы используем шаблон имени или префикс и документируем все переменные и возможные значения в README в Emvi. Таким образом, можно легко найти переменные конфигурации внутри наших приложений (например, с помощью текстового поиска) и узнать возможные значения.

Если вы используете переменную конфигурации довольно часто, вам следует «кэшировать» ее значение в памяти, а не читать ее каждый раз, когда она вам нужна. Вот пример того, чего нельзя делать:

for whatever := aLotOfObjects {
    if whatever.Name == os.Getenv(“WHATEVER_NAME_SHOULD_NOT_BE”) {
        whatever.Name = “You don’t need to know that”
    }
}

В этом примере мы перебираем срез и проверяем член каждой структуры на соответствие переменной среды и меняем его имя в зависимости от результата. Чтение переменной окружения через os.Getenv - очень медленный процесс. Поэтому вместо того, чтобы каждый раз читать его из среды, вы должны сохранить его значение для дальнейшего использования. Это можно сделать, прочитав его в переменную перед циклом for или в файле init.go пакета с помощью переменной конфигурации:

var (
    whateverNameShouldBe = ""
)
func init() {
    whateverNameShouldBe = os.Getenv("WHATEVER_NAME_SHOULD_BE")
}

А теперь мы можем просто использовать whateverNameShouldBe внутри цикла for. Установка его в файле init.go означает, что вы не сможете изменить конфигурацию на лету. Поэтому, если вам нужно активно изменять его во время работы вашего приложения, воспользуйтесь первым методом.

Если вам понравилась эта статья, оставьте 👏 и подпишитесь на нас для публикации будущих статей.