Эта библиотека предоставляет функциональность, аналогичную встроенной библиотеке флагов go, но обеспечивает гораздо большую функциональность и более удобное форматирование. Из документации:
Флаги пакета предоставляют обширный анализатор параметров командной строки. Пакет flags по функциональности аналогичен встроенному пакету флагов go, но предоставляет больше опций и использует отражение, чтобы обеспечить удобный и краткий способ указания параметров командной строки.
Поддерживаемые функции:
Пакет flags использует структуры, отражение и теги полей структуры, чтобы пользователи могли указывать параметры командной строки. В результате вы получите очень простое и краткое описание опций вашего приложения. Например:
type Options struct {
Verbose [] bool `short:"v" long:"verbose" description:"Show verbose debug information"`
}
Здесь указывается один параметр с коротким именем -v и длинным именем --verbose. Если в командной строке найден ключ -v или --verbose, к полю Verbose будет добавлено значение true. например, при указании -vvv результирующим значением Verbose будет {[true, true, true]}.
var opts struct {
// Slice of bool will append 'true' each time the option
// is encountered (can be set multiple times, like -vvv)
Verbose [] bool `short:"v" long:"verbose" description:"Show verbose debug information"`
// Example of automatic marshalling to desired type (uint)
Offset uint `long:"offset" description:"Offset"`
// Example of a callback, called each time the option is found.
Call func ( string ) `short:"c" description:"Call phone number"`
// Example of a required flag
Name string `short:"n" long:"name" description:"A name" required:"true"`
// Example of a flag restricted to a pre-defined set of strings
Animal string `long:"animal" choice:"cat" choice:"dog"`
// Example of a value name
File string `short:"f" long:"file" description:"A file" value-name:"FILE"`
// Example of a pointer
Ptr * int `short:"p" description:"A pointer to an integer"`
// Example of a slice of strings
StringSlice [] string `short:"s" description:"A slice of strings"`
// Example of a slice of pointers
PtrSlice [] * string `long:"ptrslice" description:"A slice of pointers to string"`
// Example of a map
IntMap map [ string ] int `long:"intmap" description:"A map from string to int"`
// Example of env variable
Thresholds [] int `long:"thresholds" default:"1" default:"2" env:"THRESHOLD_VALUES" env-delim:","`
}
// Callback which will invoke callto: to call a number.
// Note that this works just on OS X (and probably only with
// Skype) but it shows the idea.
opts . Call = func ( num string ) {
cmd := exec . Command ( "open" , "callto:" + num )
cmd . Start ()
cmd . Process . Release ()
}
// Make some fake arguments to parse.
args := [] string {
"-vv" ,
"--offset=5" ,
"-n" , "Me" ,
"--animal" , "dog" , // anything other than "cat" or "dog" will raise an error
"-p" , "3" ,
"-s" , "hello" ,
"-s" , "world" ,
"--ptrslice" , "hello" ,
"--ptrslice" , "world" ,
"--intmap" , "a:1" ,
"--intmap" , "b:5" ,
"arg1" ,
"arg2" ,
"arg3" ,
}
// Parse flags from `args'. Note that here we use flags.ParseArgs for
// the sake of making a working example. Normally, you would simply use
// flags.Parse(&opts) which uses os.Args
args , err := flags . ParseArgs ( & opts , args )
if err != nil {
panic ( err )
}
fmt . Printf ( "Verbosity: %v n " , opts . Verbose )
fmt . Printf ( "Offset: %d n " , opts . Offset )
fmt . Printf ( "Name: %s n " , opts . Name )
fmt . Printf ( "Animal: %s n " , opts . Animal )
fmt . Printf ( "Ptr: %d n " , * opts . Ptr )
fmt . Printf ( "StringSlice: %v n " , opts . StringSlice )
fmt . Printf ( "PtrSlice: [%v %v] n " , * opts . PtrSlice [ 0 ], * opts . PtrSlice [ 1 ])
fmt . Printf ( "IntMap: [a:%v b:%v] n " , opts . IntMap [ "a" ], opts . IntMap [ "b" ])
fmt . Printf ( "Remaining args: %s n " , strings . Join ( args , " " ))
// Output: Verbosity: [true true]
// Offset: 5
// Name: Me
// Ptr: 3
// StringSlice: [hello world]
// PtrSlice: [hello world]
// IntMap: [a:1 b:5]
// Remaining args: arg1 arg2 arg3
Дополнительную информацию можно найти в godocs: http://godoc.org/github.com/jessevdk/go-flags.