13
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

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

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
13
Help us understand the problem. What are the problem?