首頁 >後端開發 >Golang >如何在Go中為子指令正確定義和解析獨立的FlagSet?

如何在Go中為子指令正確定義和解析獨立的FlagSet?

Barbara Streisand
Barbara Streisand原創
2024-12-11 04:43:08481瀏覽

How to Properly Define and Parse Independent FlagSets in Go for Subcommands?

在GoLang 中定義獨立的FlagSet

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn