golang 的 func 的反射使用,目前还没有很合适的优化手段
但是可以很巧妙地绕过对 func 的反射
我个人语文水平难以表达出来,所以举一个实例进行说明
低效例子
gobench 测试大约 300 ns/op
type banana struct {
value int
value2 int
}
func apple(b *banana)int{
return b.value
}
func parse_func(fn interface{}) func() int{
fnt := reflect.TypeOf(fn)
fnv := reflect.ValueOf(fn)
param := fnt.In(0).Elem()
return func() int {
arg := reflect.New(param)
resp := fnv.Call([]reflect.Value{arg}) // 严重耗时
return resp[0].Interface().(int)
}
}
fn := parse_func(apple)
高效例子
gobench 测试大约 50 ns/op
type banana struct {
value int
value2 int
}
type iBanana interface {
apple() int
}
func (b *banana) apple() int {
return b.value
}
func parse_func(b iBanana) func() int{
t := reflect.TypeOf(b)
param := t.Elem()
return func() int {
arg := reflect.New(param).Interface().(iBanana)
return arg.apple() // 无需反射
}
}
fn := parse_func(&banana{})