16

program [-d value] [--abc] [FILE1]プログラムパラメータのリストを適切に解析し、Go で"--help" や "--version" (" " など) の処理を​​自動化するにはどうすればよいですか?

4

9 に答える 9

22

Google は、より標準的なコマンド ライン解析を提供するgetoptパッケージ ( ) を作成しました (対「フラグ」パッケージ)。import "github.com/pborman/getopt"

package main

import (
    "fmt"
    "os"
    "github.com/pborman/getopt"
)

func main() {
    optName := getopt.StringLong("name", 'n', "", "Your name")
    optHelp := getopt.BoolLong("help", 0, "Help")
    getopt.Parse()

    if *optHelp {
        getopt.Usage()
        os.Exit(0)
    }

    fmt.Println("Hello " + *optName + "!")
}

 

$ ./hello --help
Usage: hello [--help] [-n value] [parameters ...]
     --help        Help
 -n, --name=value  Your name

$ ./hello --name Bob
Hello Bob!
于 2014-09-30T22:30:19.857 に答える
15

「フラグ」パッケージを使用します: http://golang.org/pkg/flag/。ただし、二重ダッシュの引数は行いません。GNU getopt の動作を正確に模倣するものは (まだ) ありません。

于 2009-11-11T11:07:12.367 に答える
10

「コマンド ライン UI」セクションから、 getopt-long パラメータを解析できるライブラリがいくつかあります。

Go1.0.2で試しました:

例:

package main

import (
    "fmt"
    goopt "github.com/droundy/goopt"
)

func main() {
    fmt.Println("flag")
    goopt.NoArg([]string{"--abc"}, "abc param, no value", noabc)

    goopt.Description = func() string {
        return "Example program for using the goopt flag library."
    }
    goopt.Version = "1.0"
    goopt.Summary = "goopt demonstration program"
    goopt.Parse(nil)
}

func noabc() error {
    fmt.Println("You should have an --abc parameter")
    return nil
}

で提供されるその他のデフォルト パラメータgoopt:

 --help               Display the generated help message (calls Help())
 --create-manpage     Display a manpage generated by the goopt library (uses Author, Suite, etc)
 --list-options       List all known flags
于 2012-07-23T11:04:00.533 に答える
7

go-flagsは非常に完全で、BSD ライセンスがあり、明確ながあります。

var opts struct {
      DSomething string `short:"d" description:"Whatever this is" required:"true"`
      ABC bool `long:"abc" description:"Something"`
}

fileArgs, err := flags.Parse(&opts)

if err != nil {
    os.Exit(1)
}
于 2013-03-09T16:48:23.447 に答える
4

私はあなたのためにそれを作りました:

package main

import (
  "fmt";
  "os"
)

func main() {
  for i, arg := range os.Args {
    if arg == "-help" {
      fmt.Printf ("I need somebody\n")
    }else if arg == "-version" {
      fmt.Printf ("Version Zero\n")
    } else {
      fmt.Printf("arg %d: %s\n", i, os.Args[i])
    }
  }
}

https://play.golang.org/p/XtNXG-DhLIも参照してください

テスト:

$ ./8.out -help -version モンキー ビジネス
私は誰かが必要です
バージョン ゼロ
引数 3: サル
引数 4: ビジネス
于 2009-11-11T13:17:25.303 に答える
2

あなたが望むのはdocoptだと思います。詳細については、投稿した以前の回答を参照してください。

于 2013-11-20T02:42:34.583 に答える
2

シンプルなライブラリとして、2017 年 8 月からgithub.com/rsc/getopt

使用するには、通常どおりパッケージ フラグでフラグを定義します。次に、次のように呼び出してエイリアスを導入しますgetopt.Alias

getopt.Alias("v", "verbose")

getopt.Aliasesまたは、エイリアスのリストを定義するために呼び出します。

getopt.Aliases(
    "v", "verbose",
    "x", "xylophone",
)

と:

一般に、新しいプログラムでは Go フラグの解析が推奨されます。これは、フラグを呼び出すために使用されるダッシュの数についてはそれほど詳しくないためです ( -verboseor--verboseと書くことができ、プログラムは気にしません)。

このパッケージは、従来の理由から、正確なgetopt(3)構文を使用することが重要な状況で使用することを意図しています。たとえば、既に を使用している既存のツールを Go で書き直す場合などですgetopt(3)

于 2019-04-18T16:19:21.520 に答える