2017-03-15 4 views
7

私はgolangには新しく、関数型の中に関数をラップするコードを時折見たことがあります。 HTTPパッケージでは我々としても、これを持っている:関数型で関数をラッピングする際のポイントは何ですか?

type HandlerFunc func(ResponseWriter, *Request) 

func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) { 
    f(w, r) 
} 

私は背後にある理由を知りたいです。メソッドを公開する型が必要な場合は、構造型を作成してメソッドを追加してください。

答えて

5

2つの主な理由:引数としての機能を受け

  1. 利便性:

    type LongFuncSig func(a int, b *int, c string, d *SomeWeirdThing, f map[string]*Foo, g ...interface{}) (*Result, error) 
    
    func DoSomething(fn LongFuncSig) { ... } 
    func DoSomethingElse(fn LongFuncSig) { ... } 
    func DoYetAnotherThing(fn LongFuncSig) { ... } 
    

    がはるかに読みやすいですし、あまりエラーが発生しやすいより:

    func DoSomething(fn func(a int, b *int, c string, d *SomeWeirdThing, f map[string]*Foo, g ...interface{}) (*Result, error)) { ... } 
    func DoSomethingElse(fn func(a int, b *int, c string, d *SomeWeirdThing, f map[string]*Foo, g ...interface{}) (*Result, error)) { ... } 
    func DoYetAnotherThing(fn func(a int, b *int, c string, d *SomeWeirdThing, f map[string]*Foo, g ...interface{}) (*Result, error)) { ... } 
    
  2. その型にメソッドをアタッチする必要があります。

    例では、http.HandlerFuncには、添付のメソッドServeHTTPがあります。これにより、関数はhttp.Handlerインターフェイスを満たします。名前付き型にメソッドをアタッチすることは可能です。

    そして、あなたの関連質問に答えるために:私たちは構造体型を作成し、それにメソッドを追加しない理由メソッドを公開タイプを持つようにしたい場合は

    を?

    これを行う理由はないからです。標準ライブラリであなたの提案を取ることを選択した可能性:

    type HandlerFunc struct { 
        Func: func(ResponseWriter, *Request) 
    } 
    

    しかし、それははるかに冗長だし、使用して読みにくいです。それを使用するには、その後、コールする必要があるだろう。代わりにはるかに簡単なの

    http.HandlerFunc{Func: fn} 
    

    を:

    http.HandlerFunc(fn) 
    

    だから不必要な複雑さを追加する理由はありません。

+0

ありがとうございました。私の質問は、本当にあなたが2号で答えたものでした。 –

関連する問題