8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Go4Advent Calendar 2017

Day 4

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

Last updated at Posted at 2017-12-03

環境変数を書きたい

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

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?