環境変数を書きたい
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")
}
ということで設定ファイルから環境変数の値を取得することができました
conf.Password.Val()
作ってみた
confieldという名前です。書いてはみたものの自分でも実践で試していないので使い勝手はわかりません。
https://github.com/seihmd/confield