Go言語_コマンドライン引数

os.Argsの利用

コマンドライン引数はosパッケージのArgs変数で利用できます。

os.Argsはstring型のスライスで定義されており、コマンドパラメータが代入されます。


package main

import (
	"fmt"
	"os"
)

func main() {
	// 引数の数を確認する。
	if len(os.Args) < 2 {
		fmt.Println("ERROR: 引数を指定してください。")
		os.Exit(1)
	}

	// os.Argsを確認する。
	fmt.Println(os.Args)

	// 個別引数へのアクセス。
	fmt.Printf("実行ファイル名: %s\n", os.Args[0])
	for i := 1; i < len(os.Args); i++ {
		fmt.Printf("引数%d: %s\n", i, os.Args[i])
	}
}

flagパッケージを利用する

コマンドオプションを指定するといった複雑な処理を行う場合はflagパッケージを使用します。


数値指定オプションの場合

flag.Intは、Int型の値をとるオプションを定義するflagパッケージの関数です。

  • 第一引数はオプション名です
  • 第二引数はオプションのデフォルト値です。オプションを指定しない場合は、デフォルト値がオプションの値に入ります。
  • 第三引数は、オプションの説明を記述しています。


package main

import (
	"flag"
	"fmt"
)

func main() {
	var intOpt = flag.Int("n", 0, "Specify the number.")

	// 解析のために必ずパースを実行する。
	flag.Parse()

	// オプションで指定された値を取り出す。
	fmt.Printf("n = %d\n", *intOpt)
}

実行結果は以下の通りです。


$ main.exe
n = 0
$ main.exe -n 3
n = 3
$ main.exe -n 18
n = 18

helpオプション「-h/-help」を指定すると、Usageメッセージが表示されます。


$ main.exe -h
Usage of main.exe:
  -n int
        Specify the number.

文字列指定オプションの場合

flag.Stringは、String型の値をとるオプションを定義するflagパッケージの関数です。

使い方はflag.Int()と同じです。以下ではオプションを併用しています。


package main

import (
	"flag"
	"fmt"
)

var (
	intOpt  = flag.Int("n", 0, "help message for n option")
	strOpt  = flag.String("s", "", "help message for s option")
)

func main() {
	flag.Parse()

	fmt.Printf("n = %d\n", *intOpt)
	fmt.Printf("s = %s\n", *strOpt)
}

実行例は以下の通りです。helpオプションも自動で設定されています。


$ main.exe
n = 0
s =
$ main.exe -s "The Go Programming Language"
n = 0
s = The Go Programming Language
$ main.exe -s "The Go Programming Language" -n 7
n = 7
s = The Go Programming Language

フラグでないコマンドライン引数

flag.Arg()やflag.Args()でフラグでないコマンドライン引数へアクセスできます。


package main

import (
	"flag"
	"fmt"
)

var (
	intOpt = flag.Int("n", 0, "help message for n option")
	strOpt = flag.String("s", "", "help message for s option")
)

func main() {
	flag.Parse()

	fmt.Printf("n = %d\n", *intOpt)
	fmt.Printf("s = %s\n", *strOpt)

	// フラグでないコマンドライン引数の数
	fmt.Println(flag.NArg())

	// フラグでないコマンドライン引数へのアクセス
	fmt.Println("args:", flag.Args())
	for i := 0; i < flag.NArg(); i++ {
		fmt.Printf("引数%d: %s\n", i+1, flag.Arg(i))
	}
}

その他のオプション型について

flagパッケージでは様々な型のオプションが用意されています。

bool型やUINT型といった指定方法も準備されているので、自前の作りこみが不要になります。

http://golang.jp/pkg/flagを参照して、利用していきます。



関連ページ