package main
import (
"reflect"
"strings"
"fmt"
)
//通用算法函数体模板
func add(args []reflect.Value) (results []reflect.Value) {
if len(args) == 0 {
return nil
}
var r reflect.Value
switch args[0].Kind() {
case reflect.Int:
n:=0
for _,a:=range args{
n+=int(a.Int())
}
r = reflect.ValueOf(n)
case reflect.String:
ss := make([]string,0,len(args))
for _,s:=range args{
ss = append(ss,s.String())
}
r=reflect.ValueOf(strings.Join(ss,""))
}
results = append(results,r)
return
}
func makeAdd(T interface{}) {
fn:=reflect.ValueOf(T).Elem()
v:=reflect.MakeFunc(fn.Type(),add) //把原始函数变量的类型和通用算法函数存到同一个Value中
fn.Set(v) //把原始函数指针变量指向v,这样它就获得了函数体
}
func main() {
//定义函数变量,未定义函数体
var intAdd func(x,y int) int
var strAdd func(a,b string) string
makeAdd(&intAdd)
makeAdd(&strAdd)
fmt.Println(intAdd(12,23)) //35
fmt.Println(strAdd("hello, ","world!")) //hello, world!
}