flag
About
コマンドラインオプションをパースしてくれる君。
- ヘルプ付き
- ショートオプションとロングオプション両対応したいときはちょっとめんどい(後述)
関連パッケージ
非公式で、flagの高機能版:
SYNOPSIS
var (
verbose bool
num int
text string
)
// flag登録
// 第2引数 ... コマンドラインオプション
// 第3引数 ... デフォルト値
// 第4引数 ... ヘルプで表示される文言
flag.BoolVar(&verbose, "v", false, "Verbose output")
flag.IntVar(&verbose, "n", 0, "Number")
flag.StringVar(&verbose, "t", "", "Text")
// コマンド引数のパース
flag.Parse()
ロングオプション対応するときは、上の例だと
flag.BoolVar(&verbose, "verbose", false, "Verbose output")
を足すと -v
と合わせて -verbose
でも行けるようになる。
ただちょっとコードの見た目がアレな感じになるので、そこまで行くと flags
なりを使うかーという気持ちにならないでもない。
参考:
How-to
サブコマンド対応
Examples:
package main
import (
"flag"
"fmt"
"os"
)
func main() {
fooCmd := flag.NewFlagSet("foo", flag.ExitOnError)
fooEnable := fooCmd.Bool("enable", false, "enable")
fooName := fooCmd.String("name", "", "name")
barCmd := flag.NewFlagSet("bar", flag.ExitOnError)
barLevel := barCmd.Int("level", 0, "level")
if len(os.Args) < 2 {
fmt.Println("expected 'foo' or 'bar' subcommands")
os.Exit(1)
}
switch os.Args[1] {
case "foo":
fooCmd.Parse(os.Args[2:])
fmt.Println("subcommand 'foo'")
fmt.Println(" enable:", *fooEnable)
fmt.Println(" name:", *fooName)
fmt.Println(" tail:", fooCmd.Args())
case "bar":
barCmd.Parse(os.Args[2:])
fmt.Println("subcommand 'bar'")
fmt.Println(" level:", *barLevel)
fmt.Println(" tail:", barCmd.Args())
default:
fmt.Println("expected 'foo' or 'bar' subcommands")
os.Exit(1)
}
}
参考:
ヘルプメッセージのカスタマイズ
パッケージ変数 Usage
や、 type FlagSet
のメンバ変数 Usage
に独自関数を設定することで、出力をカスタマイズできる。
Examples:
func usage() {
fmt.Fprintln(os.Stderr, "blah blah blah")
fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
flag.PrintDefaults()
}
func main() {
flag.Usage = usage
}
Reference
func Arg
func Arg(i int) string
フラグでないi番目のコマンドライン引数を返す。
Arg(0)
が最初の引数。
func Args
シグネチャ:
func Args() []string
フラグでないコマンドライン引数のリストを返す。
type FlagSet
https://golang.org/pkg/flag/#FlagSet
type FlagSet struct {
Usage func() // usage表示時に呼ばれる関数
}
func (*FlagSet) NArg
シグネチャ:
func (f *FlagSet) NArg() int
フラグ処理後に残った引数の数を返す。
func (*FlagSet) SetOutput
https://golang.org/pkg/flag/#FlagSet.SetOutput
シグネチャ:
func (f *FlagSet) SetOutput(output io.Writer)
usageやエラーメッセージの出力先を設定する。
outputがnilのときは os.Stderr
が使われる。