2017-02-04 4 views
1

Gibt es einen Namen für dieses Idiom, bei dem eine Funktion basierend auf dem Typ der Schnittstelle ausgewählt wird?Gibt es einen Namen für dieses Idiom?

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()] 
} 

Kopiert von encoding/json und geringfügig zur Demonstration geändert.

+0

Ich weiß es nicht gehen, aber das scheint mir eine Art von Art der Vererbung. Wenn die Funktion Teil eines ABC statt einer Schnittstelle wäre, würde die Sprache automatisch die richtige Methode basierend auf ihrem Typ auswählen. – Carcigenicate

+0

@Carcigenicate, welche Funktion meinst du? Ich glaube nicht, dass dies in irgendeiner Weise mit der Erbschaft zusammenhängt. Die beteiligten Typen sind völlig unabhängig voneinander. – Sridhar

+0

Nvm, ich glaube, ich habe den Code falsch gelesen. Von der Beschreibung oben und dann dem Code schien es, als ob Sie eine Funktion basierend auf dem Typ eines Objekts senden würden. – Carcigenicate

Antwort

2

Ich würde dies dynamische Methode Versand nennen. Mehr oder weniger der gleiche Mechanismus, der in der Go-Schnittstellenimplementierung verwendet wird, wobei map[reflect.Type]encoderFunci-table genannt wird. Man kann das Marshalling sogar nur mit Schnittstellen umschreiben, außer dass wir keine Methoden für eingebaute Typen schreiben können.

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

Danke für den Punkt @Sridhar. Und es war ein Tippfehler. – Uvelichitel

Verwandte Themen