golang 通过反射机制实现类似php call_user_func_array函数

golang 通过反射机制实现类似php call_user_func_array函数

完整代码

package main

import (
	"fmt"
	"reflect"
)

type Validate struct {

}

func (v *Validate)Is(name string,data string) string{
	fmt.Println(name)
	fmt.Println(data)
	return "调用成功"
}

func call_user_func_array(obj interface{},name string,param []interface{}) (interface{},bool) {
	t := reflect.TypeOf(obj)
	_func,ok := t.MethodByName(name)
	if !ok{
		fmt.Println("方法不存在")
		return nil,false
	}
	_param := make([]reflect.Value,len(param)+1)
	_param[0] =  reflect.ValueOf(obj)
	for key,value := range param{
		_param[key+1] =  reflect.ValueOf(value)
	}
	res := _func.Func.Call(_param)
	return res,false
}

func main(){
	_func := "Is"
	param := []interface{}{
		"张三","李四",
	}
	v := &Validate{}
	res,_:= call_user_func_array(v,_func,param)
	fmt.Println(res)
}




运行结果

张三
李四
[调用成功]

代码解析

func call_user_func_array(obj interface{},name string,param []interface{}) (interface{},bool) {
	t := reflect.TypeOf(obj)
	//TypeOf下的MethodByName方法有两个返回值(Method, bool),可以先通过bool值来判断该方法是否存在
	_func,ok := t.MethodByName(name)
	if !ok{
		fmt.Println("方法不存在")
		return nil,false
	}
	//这里对调用方法的参数进行处理
	//这里的参数必须使用[]reflect.Value
	//这里我为什么要对切片的长度进行加1呢?
	//在方法 func (v *Validate)Is(name string,data string)中这里算的参数是3个,v *Validate 也算一个参数
	//如果不进行+1 会抛出reflect: Call with too few input arguments 错误
	_param := make([]reflect.Value,len(param)+1)
	_param[0] =  reflect.ValueOf(obj)
	for key,value := range param{
		_param[key+1] =  reflect.ValueOf(value)
	}
	res := _func.Func.Call(_param)
	return res,false
}

最近正好需要使用到这么一个方法,这里主要来做一个记录,防止忘了😂😂😂
我也是最近才开始学习golang的,如果本文有什么错误的地方还望大佬指出

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值