2013-10-26 7 views
21

Goの関数でデフォルト値を指定する方法はありますか?私はドキュメントでこれを見つけようとしていますが、これが可能であることを指定するものは何も見つかりません。Goのメソッドのデフォルト値

答えて

13

いいえ、Googleでの権限は、それをサポートしないことを選択しました。

https://groups.google.com/forum/#!topic/golang-nuts/-5MCaivW0qQ

+3

また、この[公式の声明とのディスカッション](https://groups.google.com/forum/#!msg/golang-nuts/3Go3gPNIPaw/Pv2B5udjDgMJ)と[この関連する質問](http://stackoverflow.com/questions/2032149/optional-parameters)。 – nemo

33

NOが、デフォルト値を実装するために他のいくつかのオプションがあります。件名にはgood blog postsがいくつかありますが、具体的な例がいくつかあります。


オプション1:発信者がデフォルト値を使用することを選択

// Both parameters are optional, use empty string for default value 
func Concat1(a string, b int) string { 
    if a == "" { 
    a = "default-a" 
    } 
    if b == 0 { 
    b = 5 
    } 

    return fmt.Sprintf("%s%d", a, b) 
} 


オプション2:

// a is required, b is optional. 
// Only the first value in b_optional will be used. 
func Concat2(a string, b_optional ...int) string { 
    b := 5 
    if len(b_optional) > 0 { 
    b = b_optional[0] 
    } 

    return fmt.Sprintf("%s%d", a, b) 
} 


オプションで単一オプションのパラメータ3:設定構造体

// A declarative default value syntax 
// Empty values will be replaced with defaults 
type Parameters struct { 
    A string `default:"default-a"` // this only works with strings 
    B string // default is 5 
} 

func Concat3(prm Parameters) string { 
    typ := reflect.TypeOf(prm) 

    if prm.A == "" { 
    f, _ := typ.FieldByName("A") 
    prm.A = f.Tag.Get("default") 
    } 

    if prm.B == 0 { 
    prm.B = 5 
    } 

    return fmt.Sprintf("%s%d", prm.A, prm.B) 
} 


オプション4:パース全可変長引数(ジャバスクリプトスタイル)

func Concat4(args ...interface{}) string { 
    a := "default-a" 
    b := 5 

    for _, arg := range args { 
    switch t := arg.(type) { 
     case string: 
     a = t 
     case int: 
     b = t 
     default: 
     panic("Unknown argument") 
    } 
    } 

    return fmt.Sprintf("%s%d", a, b) 
} 
+9

何が苦しいですか。 'func Concat1(文字列= 'foo'、b int = 10)文字列{'他のほとんどの現代の言語のように...これは、与えられた例のどれもコードの1行に相当するものになります。 – Rotareti

+0

2つの異なる関数を記述し、それが呼び出し元に任せて、それらが期待することを明示するかどうかを選択できますか? – ProgramCpp

1

いいえ、デフォルトを指定する方法はありません。私はこれが、ライター側でもう少し時間を費やして(そして、うまくいけば考えて)、可読性を高めるために意図的に行われたと信じています。

私は "デフォルト"を持つ適切なアプローチは、より一般的な機能にそのデフォルトを供給する新しい機能を持つことだと思います。これを持って、あなたのコードはあなたの意図でより明確になります。たとえば、

func SaySomething(say string) { 
    // All the complicated bits involved in saying something 
} 

func SayHello() { 
    SaySomething("Hello") 
} 

ほとんどの努力で、私は共通のことをして汎用関数を再利用しました。多くのライブラリでこれを見ることができます。たとえばfmt.Printlnは、そうでなければfmt.Printの改行を追加するだけです。しかし、誰かのコードを読むときに、彼らが呼び出す機能によって何をするつもりであるかは明らかです。デフォルト値では、何が起こっているのかわからないでしょう。デフォルト値が実際に何であるかを参照する関数に行く必要はありません。

関連する問題