【发布时间】:2017-02-04 20:07:23
【问题描述】:
这个习语有名字吗?根据接口类型选择函数?
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 复制并稍作改动以进行演示。
【问题讨论】:
-
我不知道 Go,但这让我觉得是一种继承。如果函数是 ABC 而不是接口的一部分,则该语言会根据其类型自动选择正确的方法。
-
@Carcigenicate,你指的是哪个功能?我认为这与继承无关。涉及的类型完全不相关。
-
Nvm,我想我看错了代码。从顶部的描述和代码来看,您似乎是在根据对象的类型分派一个函数。
-
一个函数确实是根据对象的类型“分派”的,但这些类型彼此完全无关。通过继承(可能是多态),被调用的函数取决于对象的类型——但对象都是特定的父类型。