2017/06/09

Goでコマンドライン引数と環境変数の両方からflagを設定したい - Qiita

Goで実装したプログラムでオプションをコマンドライン引数から取るには標準の `flag` パッケージを使いますが、値を環境変数からも読みたいことがあります。(特に Docker で動かす場合) htt...

http://qiita.com/sfujiwara/items/f177d85e9c10f4c34fb6

実は結構簡単に出来ます。github.com/namsral/flag に依存したくない場合や github.com/namsral/flag が実は flag 互換で無かった、なんて問題が見付かった場合に使えるハックです。

オリジナルのコード

package main

import (
    "flag"
    "fmt"
)

func main() {
    var age int
    flag.IntVar(&age, "age"20"your age")
    flag.Parse()
    fmt.Println(age)
}

これに5行(importも入れると実際は7行)足します。

package main

import (
    "flag"
    "fmt"
    "os"
    "strings"
)

func main() {
    var age int
    flag.IntVar(&age, "age"20"your age")
    flag.VisitAll(func(f *flag.Flag) {
        if s := os.Getenv(strings.ToUpper(f.Name)); s != "" {
            f.Value.Set(s)
        }
    })
    flag.Parse()
    fmt.Println(age)
}

こうする事で

flagenv

簡単に環境変数から値を上書きできる様になります。

Posted at 11:06 | WriteBacks () | Edit
Edit this entry...

wikieditish message: Ready to edit this entry.






















A quick preview will be rendered here when you click "Preview" button.