GoはクロスコンパイルによってマルチOSで動作可能なことから、OSに依存しないコマンドラインインタフェース(CLI)を使ったアプリケーション開発に用いられることがあります。
CLIには、様々なオプションや引数が与えられ、プログラムはその内容によって挙動を変化させます。
様々なオプションや引数に対応するには、それらを適切に解析する必要がありますが、Goにはそれを簡単に行うための機能が標準で提供されています。
本記事では、Goのコマンドライン引数の解析方法について解説します。
記事内に記載しているプログラムは、go1.15.2を使って動作確認をしています。
Goのコマンドライン引数
Goのコマンドライン引数として、以下の内容を解説します。
- コマンドライン引数の取得方法
- osパッケージを使った取得方法
- flagパッケージを使った取得方法
コマンドライン引数の取得方法
Goでコマンドライン引数を取得するには大きく2つの方法があります。
- osパッケージの Args を使って取得する方法
- 引数で与えられた文字列をスペースで区切って、配列で取得する
- 単純な引数の取得として用いるにはこちらで十分
- flagパッケージを使って取得する方法
- プログラム内で定義した名前や取得方法に従って文字列を解析し、値を取得する
- 複雑なオプションやサブコマンドなどの引数に意味を持たせ、解析・取得する場合に有用
osパッケージを使った取得方法
osパッケージを使って、コマンドライン引数を取得するには、まずosパッケージのimportが必要となります。
引数の値はos.Argsに配列で格納されています。
例えば、以下のような引数でプログラム(cli_go.go)を実行すると、
$ go run cli_go.go abc 引数
プログラム内に記述した
fmt.Println(os.Args)
で出力される情報は、
[/tmp/go-build162885044/b001/exe/cli_go abc 引数]
となります。
配列のインデックス0は、プログラムの実行パスになります。
インデックス1以降に、コマンドラインで与えた引数が入ります。
インデックスを指定することで取得可能です。
fmt.Println(os.Args[1]) // -> abc fmt.Println(os.Args[2]) // -> 引数
このように、単純なコマンドライン引数であればこの方法でも十分使える方法となります。
flagパッケージを使った取得方法
複雑なオプションを使ったコマンドライン引数を用いる場合は、flagパッケージを用いるのが有用です。
利用するには、flagパッケージのimportが必要となります。
基本的な使い方
引数を解析するには、flag.Parseを呼出します。
解析後の引数を取得するには、flag.Argsで取得します。
flag.Parse() fmt.Println(flag.Args()) // -> [abc 引数]
上記のプログラムでは、与えた引数2つが配列で取得されます。
オプションフラグの利用
コマンドライン引数にオプションフラグ付けて、どのような引数なのか意味を持たせたい場合には、以下のようにします。
s := flag.String("str", "default", "文字列を指定する") i := flag.Int("int", 0, "数値を指定する") b := flag.Bool("bool", false, "真偽値を指定する") flag.Parse() fmt.Println(*s) fmt.Println(*i) fmt.Println(*b)
Parseを呼び出す前に、各オプションフラグを定義します。
引数の文字列、整数値、真偽値など型によって定義をしていきます。
定義をする際に、3つの引数をとります。
- 1つ目:コマンドラインに利用するオプションフラグ名を指定します。
- 2つ目:このオプションフラグが指定されなかった場合のデフォルト値を指定します。
- 3つ目:このオプションフラグの使用方法の説明を指定します。
この定義の戻り値は、オプションフラグの値を格納するアドレスとなります。
実際の値を参照する場合は、アスタリスクを付けて実体を参照します。
上記のプログラムを以下のコマンドで実行します。
$ go run cli_go.go -str 引数 -int 3 -bool true
結果は以下となります。
引数 3 true
オプションフラグを指定せずに
$ go run cli_go.go
で実行すると、以下の結果となります。
default 0 false
オプションの指定方法
コマンドラインで指定するオプションの指定方法は、以下が可能です。
いずれの場合も取得できる値は同じになります。
- -str 文字列:オプションフラグにはハイフンが必要
- –str 文字列:ハイフンが2つでも可能
- -str=文字列:オプションフラグと値の間がイコールでも可能
- -str “文字列”:値をダブルクォートで括っても可能
ハイフンを付けなかったり、定義していないオプションフラグを指定すると、無視されます。
詳細情報の表示
-help(または–help) を付けて実行すると、定義した詳細情報が表示されます。
例えば以下のように表示されます。
Usage of /tmp/go-build250000259/b001/exe/cli_go: -bool 真偽値を指定する -int int 数値を指定する -str string 文字列を指定する (default "default")
まとめ
Goのコマンドライン引数についてまとめると以下になります。
- 引数値の取得方法はosパッケージを使う方法とflagパッケージを使う方法がある。
- flagパッケージはオプションフラグを使ったコマンドライン引数の解析が簡単に行える。
- コマンドのヘルプ情報の表示も自動で作成してくれる。
マルチプラットフォームで動作可能なコマンドを作る際には、ぜひ利用していただければと思います。
今回Goのコマンドライン引数について解説しました。
以上、参考になれば幸いです。
コメント