package main
import (
"fmt"
"reflect"
)
func MakeFunc(fn interface{}) {
if reflect.TypeOf(fn).Kind() != reflect.Ptr {
panic("it is not ptr")
}
v := reflect.ValueOf(fn).Elem()
v.Set(reflect.MakeFunc(v.Type(), func(args []reflect.Value) (results []reflect.Value) {
fmt.Println("making function ....")
if len(args) != 2 {
panic("args length is not 2")
}
return []reflect.Value{args[1], args[0]}
}))
}
func main() {
var swapInt func(a, b int) (int, int)
MakeFunc(&swapInt)
fmt.Println(swapInt(1, 2))
var swapFloat func(a, b float64) (float64, float64)
MakeFunc(&swapFloat)
fmt.Println(swapFloat(1.1, 2.2))
}
能否用该特性做一些高大上的代理功能呢?