【Go】コマンドライン引数を扱う。flagとos.Args

2021/09/13に公開

はじめに

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だとデフォルト値を設定出来るので便利ですね。

参考

https://pkg.go.dev/flag

Discussion