2

最後の引数がオプションである関数がある場合、引数をオプションにするために使用するのは適切な方法...ですか、それとも悪い形式と見なされますか?

例:

func Foo(s ...string) {
    switch len(s) {
        case 0:
            fmt.Println("You didn't pass an argument")
        case 1:
            fallthrough
        default:
            fmt.Printf("You passed %s\n", s[0])
    }
}

Foo("bar")        // "You passed bar"
Foo()             // "You didn't pass an argument"
Foo("bar", "baz") // "You passed bar"

この例では、渡された引数が多すぎてもかまいませんが、default:必要に応じてそれを処理できます。

4

3 に答える 3

12

オプションの引数が本当に必要な場合(Go stdlib からわかるように、まれです)、慣用的な方法は、オプションの引数ごとにフィールドを持つ構造体を定義することです。その後、呼び出し元はフィールドを持つ構造体リテラルを渡すことができます。彼らは記入したい。

より一般的なのは、代替の関数またはメソッドを提供することです。これは、ほとんどの場合、1 つまたは 2 つの「オプションの」引数のみである必要があります。

Python のような言語のオプションの引数は、多くの場合、API が成長し、関数やメソッドの引数が誰にも覚えられないほど多くなるまで成長し、引数のさまざまな組み合わせがどのように相互作用するかが明確にならないことを意味します (そして、それらはさらにテストされていません)。

パラメーターのさまざまな組み合わせに対して明示的な関数とメソッドを定義することを強制するには、API について前もってより多くのことを考慮する必要がありますが、長期的にはより使いやすく保守しやすくなります。

于 2012-09-23T04:29:49.097 に答える
6

これはお勧めしません。オプションの引数を渡すために (ab) 可変引数を使用すると、さまざまな問題が発生します。それらの中で最も重要なのは、おそらくラストのフォームがarg ...T)1 つのタイプのみを許可することです。複数の型を持つ複数のオプションのパラメーターを使用することはできます...interface{}が、実行時に不要な (ボックス化解除) コストが発生し、(有用な) コンパイル時の型チェックが欠けています。

反対のもう1つの考えられる議論は、非公式のGoコーディングスタイルガイドと見なされている標準ライブラリのどこにも、これの例/前例が見つからないと思うということです。

于 2012-09-22T15:04:59.563 に答える
0

それはすべてプロジェクトの要件に依存します。プロジェクトがこのような状況にある場合、悪い形はありません。

オプションの引数機能は、この種の状況のた​​めにのみ提供されています。

于 2012-09-22T13:29:20.583 に答える