Goでコマンドラインオプションを簡単に使う方法
非常にコンパクト
同じ目的を達成するためのパッケージにcliというものもある こちらは個人的にはやや機能豊富すぎる印象
やや作法が厳格で複雑な印象
結構オプションの定義が大変
多機能なコマンドを作るなら良いかも
実装方法
go get github.com/jessevdk/go-flagsを実行してパッケージインストール
code:main.go
import flags "github.com/jessevdk/go-flags"
// options オプション引数
type options struct {
Version func() short:"v" long:"version" description:"バージョン情報"
Delimiter string short:"d" long:"delimiter" description:"入力データの区切り文字" default:"\t"
WriteFlag bool short:"w" long:"write" description:"入力ファイルを上書きする"
OutFile string short:"o" long:"outfile" description:"出力ファイルパス"
}
func main() {
var opts options
opts.Version = func() {
fmt.Println(Version)
os.Exit(0)
}
args, err := flags.Parse(&opts)
if err != nil {
os.Exit(0)
}
fmt.Println(opts)
}
options.Delimiter, options.WriteFlag, options.OutFileは僕が今回のcliアプリ用に追加したコマンドラインオプション
-dと--delimiterと両方定義できる
デフォルト値もセットできる
args, err := flags.Parse(&opts)ではオプションでない引数とerrを判定
app.exe -d , foo.txt bar.txtといった具合に実行
argsの値は[foo.txt, bar.txt]といった具合
これがかなり使いやすい/icons/+1.icon
-hを渡すとこのerrにnil以外の値がセットされる
なのでexit 1にしていない
複雑なサブコマンドとかを設定したなら cobra がおすすめ スター数的もダントツで多い
docker, hugo, delveなどメジャーなCLIの採用実績あり