首頁 > 後端開發 > Golang > 如何讓兩個以上的命令列標誌控制相同的行為?

如何讓兩個以上的命令列標誌控制相同的行為?

WBOY
發布: 2024-02-06 10:06:03
轉載
1290 人瀏覽過

如何讓兩個以上的命令列標誌控制相同的行為?

問題內容

在go中,我知道如何使用github.com/pborman/getopt套件來執行類似getopt的命令列解析。

但是,這個軟體包似乎只能支援每個命令列選項的一個字串版本和一個符文版本。有時我想要的不僅僅是兩種方法來指定選項。例如,對於一個名為 prog 的假設程序,我希望以下程式碼都執行完全相同的功能:

prog -r [other args]
prog -r [other args]
prog --recurse [other args]
prog --recursive [other args]
登入後複製

我知道我可以執行以下操作,並測試每個變數 optrecurseoptrecursive 的值 ...

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

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板