package main
import (
"fmt"
"reflect"
)
type User struct {
Id int
Name string
Age int
}
type Object struct{}
func (obj Object) Hello(args ...interface{}) int {
fmt.Println("func call ")
argc := 0
for _, v := range args {
fmt.Println(v)
argc++
}
return argc
}
func main() {
// m := User{1, "sth", 20}
// t := reflect.TypeOf(m)
// fmt.Println(t)
// fmt.Printf("%#v\n", t.Field(0))
// fmt.Printf("%#v\n", reflect.ValueOf(m).Field(1))
var obj Object
ptr := reflect.ValueOf(obj)
fun := ptr.MethodByName("Hello")
//args := []reflect.Value{reflect.ValueOf("str1"), reflect.ValueOf("str2"), reflect.ValueOf(5), reflect.ValueOf(7)}
args := make([]reflect.Value, 0) //make len must be zero to create a nil slice
str := []string{"str1", "str2"}
num := []int{3, 4, 5}
for _, k := range str {
args = append(args, reflect.ValueOf(k))
}
for _, i := range num {
args = append(args, reflect.ValueOf(i))
}
rv := fun.Call(args)
for i, val := range rv {
fmt.Printf("%d --> %#v\n", i, val)
}
}
如上为golang中实现函数动态调用,类似于php中的 call_user_func_array() 函数