2017-02-04 1 views
1

インターフェイスのタイプに基づいて関数が選択されるこのイディオムの名前はありますか?このイディオムの名前はありますか?

type encoderFunc func(e *encodeState, v reflect.Value, opts encOpts) 

var encoderCache struct { 
    m map[reflect.Type]encoderFunc 
} 

func (e *encodeState) marshal(v interface{}, opts encOpts) (err error) { 
    v := refect.ValueOf(v) 
    valueEncoder(v)(e, v, opts) 
    return nil 
} 

func valueEncoder(v reflect.Value) encoderFunc { 
    return encoderCache.m[v.Type()] 
} 

encoding/jsonからコピーされ、デモ用に少し変更されています。

+0

私には分かりませんが、これは私を一種の相続財産と呼びます。関数がインタフェースではなくABCの一部であった場合、言語はその型に基づいて正しいメソッドを自動的に選択します。 – Carcigenicate

+0

@Carcigenicate、あなたはどういう意味ですか?私はこれがいかなる方法でも継承に関係しているとは思わない。関係するタイプは完全に無関係です。 – Sridhar

+0

Nvm、私はコードを誤解したと思う。一番上の記述とコードから、オブジェクトの型に基づいて関数をディスパッチしているように思えました。 – Carcigenicate

答えて

2

私はこれをダイナミックメソッドディスパッチと呼びます。多かれ少なかれ、map[reflect.Type]encoderFunci-tableと呼ばれるGoインタフェースの実装で使用されたのと同じメカニズムです。組み込み型のメソッドを書くことができないという点を除いて、マーシャリングだけをインターフェースで書き直すこともできます。

type encodable interface{ 
    encode(e *encodeState, opts encOpts) 
} 
func (st SomeType) encode(e *encodeState, opts encOpts){ 
... 
} 
... 
func (ot OtherType) encode(e *encodeState, opts encOpts){ 
... 
} 
func (e *encodeState) marshal(v encodable, opts encOpts) (err error) { 
    v.encode(e, opts) 
    return nil 
} 
+0

ポイント@Sridharをありがとう。そして、申し訳ありません、それはタイプミスでした。 – Uvelichitel

関連する問題