Go 文件指出FlagSet 類型允許創建獨立的標誌集,這對於在命令中實現子命令非常有用-線接口。然而,實現此功能可能具有挑戰性。
定義兩個 FlagSet 時,如果命令列包含用於第二個 FlagSet 的標誌,則解析其中一個可能會導致錯誤或警告。例如,考慮以下程式碼:
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) }
執行 cmd -apply 或 cmd -reset 會產生各種警告。此行為是由於子命令之間缺乏區別所造成的。為了有效地分離這些 FlagSet,需要先區分子指令,然後解析正確的 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) } }
此程式碼允許 -silent專門與 apply 子命令一起使用的標誌,以及專門與 Reset 子命令一起使用的 -loud 標誌。
以上是如何在Go中為子指令正確定義和解析獨立的FlagSet?的詳細內容。更多資訊請關注PHP中文網其他相關文章!