⛳
【Go】コマンドライン引数を扱う。flagとos.Args
はじめに
batch処理でコマンドライン引数を使う事があり、少し調べましたので、
アウトプットとして記事にします。
環境
go 1.16
使用するパッケージ
- flag
- os.Args
コマンドライン引数とは
go run main.go a b c
のコマンドで実行した際の a b cを受け取って処理を行うこと。
Goではos.Argsとflagがよく使われますので、この2つを解説していきます。
os.Args
まずはosパッケージのArgsからやってみます。
import (
"fmt"
"os"
)
func main() {
// argsを実行
testA()
}
// os.Args
func testA() {
// Argsが何件あるか出力します
fmt.Println("count:", len(os.Args))
// Argsの中身を一件ずつ出力します
for i, v := range os.Args {
fmt.Printf("args[%d] -> %s\n", i, v)
}
}
コマンド
go run main.go a b c
go run main.go{半角スペース}a{半角スペース}b{半角スペース}cです。
全角スペースだとエラーとなりますので、ご注意ください。
実行結果
count: 4
args[0] -> /var/folders/rs/l7vzdmv118jb7dh6twzlrlk80000gp/T/go-build3055200085/b001/exe/main
args[1] -> a
args[2] -> b
args[3] -> c
args[0]には実行内容が入りますので、実際の内容はargs[1]から入ります。
argsは型のチェックなどは無いので、そういった機能を持たせたい場合は、次のflagを利用するか、
受け取った後に処理するかになります。
flag
続いてflagです。
package main
import (
"flag"
"fmt"
)
func main() {
// flagを実行
testB()
}
// flag
func testB() {
//変数でflagを定義します
var (
s = flag.String("s", "default message.", "string flag")
i = flag.Int("i", 0, "int flag")
b = flag.Bool("b", false, "bool flag")
)
//ここで解析されます
flag.Parse()
fmt.Printf("param -s : %s\n", *s)
fmt.Printf("param -i : %d\n", *i)
fmt.Printf("param -b : %t\n", *b)
}
varの部分でまず変数として、flagを定義します。
変数名 = flag.String("オプション名", "デフォルト値", "このフラグの説明"))
こんな感じで定義をします。
s = flag.String("s", "default message.", "string flag")
こちらは、sというオプションで実行されるものです。
オプションで値が渡されなかった場合は、変数sには"default message"が代入されます。
コマンド
go run main.go -s hoge -i 10 -b true
実行結果
param -s : hoge
param -i : 10
param -b : true
となります。
さいごに
どちらも簡単に使えました。
flagだとデフォルト値を設定出来るので便利ですね。
参考
Discussion