golang 函数动态调用

wallywl / 2023-05-14 / 原文

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()  函数