Help us understand the problem. What is going on with this article?

Goで設定ファイルに環境変数書きたい気がする

More than 1 year has passed since last update.

環境変数を書きたい

yamlかなにかのファイルにアプリケーションの設定値を書くとき、環境変数も一緒に書けたらいいのに・・・と思うことはないでしょうか。そういうときこの方法ならいけるんじゃないか、という話です。最初に言っておくと実用性は不明です。

方法

yamlで設定を書きます。$始まりが環境変数で、それが設定されていない場合は|で区切って右側の文字列を設定値に使用する、という感じ。

yml := `
password: $DBPASS|mypass
user: $DBUSER|root
name: $DBNAME|db_dev
host: $DBHOST|localhost
`

stringのnamed typeを作ります。

type F string

yamlを受けるstructを作ります。

type dbSetting struct {
    Password F
    User     F
    Name     F
    Host     F
}

受けます。

conf := dbSetting{}
yaml.Unmarshal([]byte(yml), &conf)

Fにはレシーバメソッドを作ってあります。
こんな感じで。

func (f *F) Val() (string, error) {
    // 空文字だったらエラー
    if f.raw() == "" {
        return "", errors.New("value not set")
    }

    // sep == "|" で分解
    pieces := strings.Split(f.raw(), sep)
    for _, p := range pieces {
        // $から始まる = 環境変数
        if strings.HasPrefix(p, envvarPrefix) {
            // 環境変数が見つかったらそれを返す
            if env, ok := os.LookupEnv(strings.TrimLeft(p, envvarPrefix)); ok {
                return env, nil
            }
            continue
        }
        // 環境変数が見つからない || 普通の文字列の場合
        return p, nil
    }
    return "", errors.New("value not set")
}

ということで設定ファイルから環境変数の値を取得することができました :tada:

conf.Password.Val()

作ってみた

confieldという名前です。書いてはみたものの自分でも実践で試していないので使い勝手はわかりません。
https://github.com/seihmd/confield

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away