这个成语有名字吗?

时间:2017-02-04 20:07:24

标签: go idioms

这个习惯用法的名称是否根据界面类型选择了一个函数?

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复制并稍加修改以进行演示。

1 个答案:

答案 0 :(得分:2)

我称之为动态方法调度。在map[reflect.Type]encoderFunc调用i-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
}