2017-12-15 1 views
0
if v, ok := os.LookupEnv("IDAASHTTPPORT"); ok { 
    c.HTTPPort, _ = strconv.Atoi(v) 
} 
if v, ok := os.LookupEnv("IDAASDBNAME"); ok { 
    c.DBUserName = v 
} 
if v, ok := os.LookupEnv("IDAASDBPW"); ok { 
    c.DBPasswd = v 
} 
if v, ok := os.LookupEnv("IDAASDBPORT"); ok { 
    c.DBPort, _ = strconv.Atoi(v) 
} 
if v, ok := os.LookupEnv("IDAASDBHOST"); ok { 
    c.DBHost = v 
} 

'c' が、私は唯一の環境変数が存在する場合は、構造体のフィールドを更新する次のstructこの一連のifをよりエレガントに書くことはできますか?

type Configuration struct { 
    HTTPPort int 
    DBUserName string 
    DBPasswd string 
    DBPort  int 
    DBHost  string 
} 

です。ちょっとかわいい地図イテレータやそれがうまくいくかのようだが、いい解を見つけることはできない。

+0

設定されていない場合の値は何ですか?もしそれらがデフォルト(空)の場合、 'c.DBUserName = os.Getenv(" IDAASDBPW ")' –

+0

と 'c.HTTPPort、_ = strconv.Atoi(" IDAASHTTPPORT ")'を実行してください。 env var missing –

+0

これを一般的な方法で行いたい場合は、環境変数名とデータ型を与えるフィールドにstructタグを追加することができます。その後、リフレクションを使用してフィールドに値を設定する関数を書くことができます。そうすれば、新しいフィールドを追加する場合に必要なのは、適切なタグでフィールドを定義することだけです。 –

答えて

1

あなたは、いくつかのヘルパー関数を使用することができます。

func setIntFromEnv(val *int, envName string) { 
    if v, ok := os.LookupEnv(envName); ok { 
    *val, _ = strconv.Atoi(v) 
    } 
} 

func setStringFromEnv(val *string, envName string) { 
    if v, ok := os.LookupEnv(envName); ok { 
    *val = v 
    } 
} 

// From your main function. 
setIntFromEnv(&c.HTTPPort, "IDAASHTTPPORT") 
setStringFromEnv(&c.DBUserName, "IDAASDBNAME") 
etc... 

これだけの作品は、あなたがOKなら、あなたがintとして解析しようとしている文字列のenv VARを無視します。相対的な優雅さも議論の余地があります。

+0

さらに進んで、これを 'val'とtype interface {}でタイプスイッチを使用する単一のヘルパーにすることができますか? – Sap

+0

できますが、私はそれをあなたのための練習として残します。 [ツアー](https://tour.golang.org/methods/16)には必要なものが必要です。 – Marc

関連する問題