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

  • 3
    いいね
  • 0
    コメント

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

https://github.com/namsral/flag を使うと便利です。標準の flag を置き換える形で、import 1行で対応できます。

package main

import (
    "fmt"

    "github.com/namsral/flag"
)

func main() {
    var age int
    var fooBar string
    flag.IntVar(&age, "age", 0, "age of gopher")
    flag.StringVar(&fooBar, "foo-bar", "hoge", "hoge")
    flag.Parse()

    fmt.Println("age:", age)
    fmt.Println("foo-bar:", fooBar)
}
$ go run main.go -age 1 -foo-bar baz
age: 1
foo-bar: baz

$ AGE=2 FOO_BAR=BAZ go run main.go
age: 2
foo-bar: BAZ

$ AGE=2 go run main.go -age 3
age: 3
foo-bar: hoge

環境変数と引数で両方指定すると、引数が優先になります。

configファイルを作って、そこから読むこともできます。

flag.String(flag.DefaultConfigFlagname, "", "path to config file")
$ cat example.conf
# comment
age=4
foo-bar=XYZ

$ go run main.go -config example.conf
age: 4
foo-bar: XYZ