Unabhängige Flag-Sets in GoLang
In der Go-Dokumentation für das Flag-Paket heißt es, dass es die Definition unabhängiger Flag-Sets ermöglicht, geeignet zum Implementieren von Unterbefehlen in einer Befehlszeilenschnittstelle. Es stellt sich jedoch die Frage, wie diese Funktionalität erreicht werden kann.
In einem Szenario, in dem zwei FlagSet-Objekte definiert sind, kann das Parsen eines davon zu Fehlern und Warnungen führen, wenn die Befehlszeile Flags enthält, die für das andere bestimmt sind. Das folgende Beispiel veranschaulicht dieses Problem:
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) }
Dieser Code erzeugt Warnungen, wenn versucht wird, cmd -apply oder cmd -reset auszuführen. Das Ziel besteht darin, separate FlagSet-Objekte zu verwalten und sicherzustellen, dass -silent nur für -apply funktioniert.
Die Lösung besteht darin, die Unterbefehle zu unterscheiden und dann Parse für das entsprechende FlagSet aufzurufen. Der überarbeitete Code:
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) } }
Bei diesem Ansatz wird nur das relevante FlagSet basierend auf dem angegebenen Unterbefehl analysiert, wodurch das gewünschte Verhalten sichergestellt wird.
Das obige ist der detaillierte Inhalt vonWie implementiert man unabhängige Flag-Sets für Unterbefehle in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!