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{})