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)
}
}
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.
→ _ → 怀疑 的 眼神 ~~