为结构字段分配接口



考虑我们有一个接口的聚合结构

type Aggregation struct {
a InterfaceA
b InterfaceB
...
n InterfaceN
}

我们正试图使以下初始化该结构的字段的函数更加时髦——以消除切换:

func (a *Aggregation) Register(i interface{}) *Aggregation {
switch v := i.(type) {
case InterfaceA:
a.a = v
case InterfaceB:
a.a = b
...
case InterfaceN:
a.a = v
}
return a
}

有什么方法可以用反射来实现同样的功能吗?

这似乎在中起作用


func (a *Aggr) Register2(i interface{}) *Aggr {
v := reflect.ValueOf(a).Elem()
for j := 0; j < v.NumField(); j++ {
f := v.Field(j)
t := f.Type()
if reflect.TypeOf(i).Implements(t) {
f.Set(reflect.ValueOf(i))
break
}
}
return a
}

cc@jimb

最新更新