La documentation Go indique que le type FlagSet permet la création d'ensembles de drapeaux indépendants, ce qui est utile pour implémenter des sous-commandes dans une commande- interface de ligne. Cependant, la mise en œuvre de cette fonctionnalité peut s'avérer difficile.
Lors de la définition de deux FlagSets, l'analyse de l'un d'eux peut entraîner des erreurs ou des avertissements si la ligne de commande contient des indicateurs destinés au deuxième FlagSet. Par exemple, considérons le code suivant :
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) }
L'exécution de cmd -apply ou cmd -reset génère divers avertissements. Ce comportement est dû au manque de différenciation entre les sous-commandes. Pour séparer efficacement ces FlagSets, il est nécessaire de distinguer d'abord les sous-commandes, puis d'analyser le FlagSet correct.
Un exemple de la façon d'y parvenir :
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) } }
Ce code permet au -silent drapeau à utiliser exclusivement avec la sous-commande apply et le drapeau -loud à utiliser exclusivement avec la sous-commande reset.
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!