Ensembles de drapeaux indépendants dans GoLang
La documentation Go du package flag indique qu'elle permet la définition d'ensembles de drapeaux indépendants, adaptés pour implémenter des sous-commandes dans une interface de ligne de commande. Cependant, la question se pose de savoir comment réaliser cette fonctionnalité.
Dans un scénario où deux objets FlagSet sont définis, l'analyse de l'un peut entraîner des erreurs et des avertissements si la ligne de commande contient des indicateurs destinés à l'autre. L'exemple suivant illustre ce problème :
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) }
Ce code produit des avertissements lors de la tentative d'exécution de cmd -apply ou cmd -reset. L'objectif est de conserver des objets FlagSet séparés, en garantissant que -silent ne fonctionne que pour -apply.
La solution réside dans la distinction des sous-commandes, puis dans l'appel de Parse sur le FlagSet approprié. Le code révisé :
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) } }
Avec cette approche, seul le FlagSet pertinent sera analysé en fonction de la sous-commande spécifiée, garantissant le comportement souhaité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!