golang flag command-line go command-line-arguments

command-line - golang flag



Definiendo FlagSets independientes en GoLang (2)

Se supone que primero debe distinguir los subcomandos y luego llamar a Parse a la derecha FlagSet .

f1 := flag.NewFlagSet("f1", flag.ContinueOnError) silent := f1.Bool("silent", false, "") f2 := flag.NewFlagSet("f2", flag.ContinueOnError) loud := f2.Bool("loud", false, "") switch os.Args[1] { case "apply": if err := f1.Parse(os.Args[2:]); err == nil { fmt.Println("apply", *silent) } case "reset": if err := f2.Parse(os.Args[2:]); err == nil { fmt.Println("reset", *loud) } }

http://play.golang.org/p/eaEEx_EReX

La documentación de Go ( http://golang.org/pkg/flag/ ) dice:

El tipo FlagSet le permite a uno definir conjuntos independientes de indicadores, como implementar subcomandos en una interfaz de línea de comandos.

Necesito esta funcionalidad, pero no puedo averiguar cómo persuadir al pkg de flag para que lo haga. Cuando defino dos FlagSets, el análisis de uno de ellos me dará errores y advertencias si la línea de comandos tiene indicadores que están destinados al segundo. Ejemplo:

f1 := flag.NewFlagSet("f1", flag.ContinueOnError) apply := f1.Bool("apply", false, "") silent := f1.Bool("silent", false, "") if err := f1.Parse(os.Args[1:]); err == nil { fmt.Println(*apply, *silent) } f2 := flag.NewFlagSet("f2", flag.ContinueOnError) reset := f2.Bool("reset", false, "") if err := f2.Parse(os.Args[1:]); err == nil { fmt.Println(*reset) }

Recibo todo tipo de advertencias si trato de hacer cmd -apply O cmd -reset . Quiero mantener estos FlagSets separados porque solo quiero tener un trabajo -apply para -apply .

¿Qué me estoy perdiendo?


Solo cambia estos codigos

if err := f2.Parse(os.Args[1:]); err == nil { fmt.Println(*reset) }

a

f2.Parse(os.Args[1:]) fmt.Println(*reset)

pero la advertencia se acaba de dejar en la consola. Si desea eliminarlo, modifique /usr/local/go/src/flag/flag.go y vuelva a compilar el golang ... o haga una copia del paquete flag.

→ _ → 怀疑 的 眼神 ~~