golangのflagパッケージでコマンドラインオプションを扱う

Goでコマンドラインオプションを扱う場合はflagパッケージを使う。


以下はechoの例

package main

import (
	"flag"
	"fmt"
)

var (
	nflag = flag.Bool("n", false, "print the trailing newline character")
)

func main() {
	flag.Parse()
	var s string = ""

	for i := 0; i < flag.NArg(); i++ {
		if i > 0 {
			s += " "
		}
		s += flag.Arg(i)
	}

	if *nflag {
		s += "\n"
	}
	fmt.Println(s)
}

nflagはポインタになるのでmain関数で参照する箇所では*nflagとしてデリファレンスする。

flag.NArgで引数の数が、flag.Arg(n)でそのindexの引数の値が取得できる。


もうひとつコマンドラインオプションを扱う方法があって、以下のように変数にinit関数で関連付ける。

package main

import (
	"flag"
	"fmt"
)

var nflag bool

func init() {
	flag.BoolVar(&nflag, "n", false, "print the trailing newline character")
}

func main() {
	flag.Parse()
	var s string = ""

	for i := 0; i < flag.NArg(); i++ {
		if i > 0 {
			s += " "
		}
		s += flag.Arg(i)
	}

	if nflag {
		s += "\n"
	}
	fmt.Println(s)
}

この場合、main関数でのnflagは値になるのでデリファレンスは必要ない。