Edited at

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

More than 1 year has passed since last update.

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

[追記]

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

mattnさんから標準の flag だけで同様のことをする方法を教えていただきました。依存を減らしたい場合にはこちらの方法がお勧めです。