22

Goのフラグパッケージにデフォルト値を設定しないことは可能ですか? たとえば、flag パッケージでは、次の行を書き出すことができます。

filename := flag.String("file", "test.csv", "Filename to cope with")

上記のコードでは、必ずしもデフォルト値を設定する必要はありませんtest.csv。この場合は、代わりに常にユーザーに独自のファイル名を指定させます。指定されていない場合は、エラーを発生させてプログラムを終了します。

私が思いついた方法の 1 つは、最初に のfilename実行後に の値をチェックし、flag.Parse()その値が である場合test.csv、適切なエラー メッセージを表示してプログラムを終了させることです。ただし、回避できるのであれば、そのような冗長なコードは書きたくありません。また、回避できなくても、ここで問題に対処するためのより良い方法を聞きたいと思います。

ちなみに、Pythonのargparseモジュールでそのような操作を行うことができます-できれば同様のことを実装したいだけです...

また、短い引数と長い引数の両方 (つまり、両方-f-file引数?) を flag パッケージに実装できますか?

ありがとう。

4

2 に答える 2

22

それぞれのタイプのゼロ値に等しい場合に「存在しない」ことを意味するようにフラグ値を設計するのは慣用的だと思います。例えば:

optFile := flag.String("file", "", "Source file")
flag.Parse()
fn := *optFile
if fn == "" {
        fn = "/dev/stdin"
}
f, err := os.Open(fn)
...

2 番目の質問: IINM、設計によるフラグ パッケージは と を区別しませ-flag--flag。IOW、フラグセットに と の両方を設定し、 と の両方の前または前に任意のバージョンを書き込む-fことができます。ただし、別の定義された flag を考慮すると、フラグ パッケージは と同等であると認識しません--file---ffile-g-gf foo-g -f foo

于 2013-08-25T14:25:15.010 に答える
8

デフォルト値を持つことができないフラグがある場合、その値REQUIREDまたは類似のものをよく使用します。このほうが読みやすいと思います--help

なぜそれが焼き付けられなかったのかというと、それが十分に重要であると考えられていなかったのではないかと思います. デフォルトはすべてのニーズに合うわけではありません。ただし、--helpフラグは似ています。すべてのニーズに合うわけではありませんが、ほとんどの場合は十分です。

必要なフラグが悪い考えだと言っているわけではありません。あなたが十分に情熱を持っているなら、flagutilパッケージはいいかもしれません. flag現在のAPI をラップしParse、欠落しているフラグを説明するエラーを返して、RequiredIntなどを追加します。RequiredIntVar有用である/人気があることが判明した場合は、公式flagパッケージにマージされる可能性があります。

于 2013-08-25T17:45:39.897 に答える