GoLang 中的獨立標誌集
flag 套件的Go 文件聲明它允許定義獨立的標誌集,適合用於在命令列介面中實作子命令。然而,問題是如何實現這項功能。
在定義了兩個 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 對象,確保 -silent 僅適用於 -apply。
解在於區分子指令,然後在適當的 FlagSet 上呼叫 Parse。修改後的程式碼:
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) } }
採用此方法,只會根據指定的子指令解析相關的 FlagSet,從而確保所需的行為。
以上是Go中如何實現子命令獨立的標誌集?的詳細內容。更多資訊請關注PHP中文網其他相關文章!