Как использовать структурный тег 'default' с библиотекой envconfig от Go? - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь использовать библиотеку envconfig, https://github.com/kelseyhightower/envconfig, в программе, где большинство переменных конфигурации имеют значения по умолчанию, которые я хотел бы переопределить, только если установлены определенные переменные среды.

Я пытался запустить следующий пример программы:

package main

import (
    "fmt"
    "log"

    "github.com/kelseyhightower/envconfig"
)

type config struct {
    foo string `default:"bar"`
}

func main() {
    var cfg config
    if err := envconfig.Process("app", &cfg); err != nil {
        log.Fatalln(err)
    }
    fmt.Println(cfg.foo)
}

без установленной переменной окружения APP_FOO:

> echo $APP_FOO

Однако это не выводит barкак я и ожидал:

> go run use_envconfig.go 

Я не вижу, как моя реализация отличается от документированного примера на https://github.com/kelseyhightower/envconfig#struct-tag-support, к которому относится следующий комментарий:

Если envconfig не может найти значение переменной окружения для MYAPP_DEFAULTVAR, он заполнит его значением "foobar" в качестве значения по умолчанию.

Как я могу сделать эту программу такой, чтобы *Значение 1026 * foo равно bar, если я не установил переменную окружения APP_FOO?

Ответы [ 2 ]

1 голос
/ 15 октября 2019

В своем ответе вы случайно решили проблему. Это не config, который должен быть написан заглавными буквами. Это Foo. Следующие работы: Демо .

type config struct {
    Foo string `default:"bar"`
}

В Go только заглавные поля доступны вне текущего пакета. Envconfig может получить доступ только к заглавным полям. Думайте о них как о частной и публичной собственности.

Нижний регистр является частным, верхний регистр является открытым.

0 голосов
/ 15 октября 2019

Небольшой эксперимент показал, что и config, и foo должны быть написаны заглавными буквами (до Config и Foo соответственно). Следующая программа,

package main

import (
    "fmt"
    "log"

    "github.com/kelseyhightower/envconfig"
)

type Config struct {
    Foo string `default:"bar"`
}

func main() {
    var cfg Config
    if err := envconfig.Process("app", &cfg); err != nil {
        log.Fatalln(err)
    }
    fmt.Println(cfg.Foo)
}

производит bar, как и ожидалось:

> go run use_envconfig.go
bar
...