在go中,我知道如何使用github.com/pborman/getopt
套件來執行類似getopt
的命令列解析。
但是,這個軟體包似乎只能支援每個命令列選項的一個字串版本和一個符文版本。有時我想要的不僅僅是兩種方法來指定選項。例如,對於一個名為 prog
的假設程序,我希望以下程式碼都執行完全相同的功能:
prog -r [other args] prog -r [other args] prog --recurse [other args] prog --recursive [other args]
我知道我可以執行以下操作,並測試每個變數 optrecurse
和 optrecursive
的值 ...
optrecurse := getopt.boollong("recurse", 'r', "run recursively") optrecursive := getopt.boollong("recursive", 'r', "run recursively")
但是,理想情況下,我希望進行一次調用,為這四種可能性中的任何一種提供一個值。
我想要一些與 ruby 的 optionparser
套件類似的東西,對於任何給定的命令列選項有兩種以上的可能性。這是一個 ruby 範例...
$isRecursive = false parser = OptionParser.new { |opts| opts.on('-r', '-R', '--recurse', '--recursive') { |arg| # All four possibilities are handled with one, single "opts.on" block. $isRecursive = true } # ... etc. ... }
我對 go 還比較陌生,在尋找這個問題的答案時我很可能忽略了一些東西。
在我看來,提供兩種以上的方法來指定任何給定的命令列選項並沒有什麼「奇怪」的。
我最初在這個「答案」中提到的 github.com/clagraff/argparse
套件不再受支援。然而,我發現了一個更現代且仍然受支援的包,我可以使用它以類似於ruby 和python 等其他語言的參數解析包中提供的方式提供確切的功能:github.com/tcler/ cmdline -go/cmdline
。
這是一個範例程序,說明了它如何在 go 中工作...
package main import ( "fmt"; "os"; "github.com/tcler/cmdline-go/cmdline"; ) func main() { var nargv []string = os.args[1:] var cli cmdline.cmdline var options = []cmdline.option { {help: "options:"}, {names: "r r recurse recursive", argtype: cmdline.n, help: "run recursively"}, } cli = cmdline.parse(options, nargv) has_invalid := false for _, v := range cli.invalidoptions { if !has_invalid { fmt.println() } fmt.println(v) has_invalid = true } if has_invalid { fmt.println() cmdline.getusage(options) os.exit(1) } recursivemode := cli.getoptionargstring("r") fmt.printf("recursive mode: \"%s\"\n", recursivemode) }
我可以通過以下四種方式運行該程序,並且在每種情況下它的行為都是相同的......
% go run prog.go -r % go run prog.go -r % go run prog.go --recurse % go run prog.go --recursive
在所有這四種情況下,它總是輸出以下內容:
recursive mode: "set"
如果我在沒有任何選項的情況下運行(即,只需 go run prog.go
),它會輸出以下內容:
recursive mode: ""
如果我使用任何其他命令列參數運行,例如 -x
,則會失敗,如下所示:
% go run prog.go -x option: 'x' undefined Options: -r -R --recurse --recursive Run recursively [ plus some other "help" text ]
所以,現在我可以編寫 go 程序,它允許使用兩種以上的方式來指定任何命令列選項。
以上是如何讓兩個以上的命令列標誌控制相同的行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!