LoginSignup
22
13

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-06-09

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 だけで同様のことをする方法を教えていただきました。依存を減らしたい場合にはこちらの方法がお勧めです。

22
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
13