Golang重载函数(反射模拟)
- 首先认清重载函数的定义
1:函数参数个数不同
2:函数参数类型不同,或者类型顺序不同
Go语言本身不支持函数的重载,所以,我们利用反射+switch进行模拟反射,动态进行函数调用。
根据函数参数的个数不同,实现函数重载
首先声明结构体,并绑定两个参数
type Students struct {Name string `json:"name"`Age int
}
func (stu Students)T(n1 int,n2 int)int{//方法需要传递两个参数return n1+n2
}
func (stu Students)R(n1 int)int{//方法需要传递一个参数return n1
}
实现动态调用方法的函数
func reflecttest(n interface{},n2 ...interface{})(int,error){v:=reflect.ValueOf(n)switch len(n2) {case 1://如果传参为一个值params:=make([]reflect.Value,1)params[0]=reflect.ValueOf(n2[0])//注意传参时,需要将值的类型转化为value类型return int(v.MethodByName("R").Call(params)[0].Int()),nil//注意,返回的值以数组形式进行返回,再将返回的值转化为int64,再强制转化为int型数据case 2:如果参数为两个params:=make([]reflect.Value,2)for k,v1:=range n2{params[k]=reflect.ValueOf(v1)}return int(v.MethodByName("T").Call(params)[0].Int()),nildefault://如果传参的数量不是一个或两个。err:=errors.New("调用函数不存在")return 0,err//返回错误}
}
根据函数参数类型的不同,调用不同的函数
结构体及其绑定的方法
type Students struct {Name string `json:"name"`Age int
}
func (stu Students)T(n1 int,n2 int)string{return n1+"T()"+strconv.Itoa(n2)
}
func (stu Students)R(n1 int,n2 string)string{return strconv.Itoa(n1)+"R()"+n2
}
func reflecttest(n interface{},n2 ...interface{})(string,error){v:=reflect.ValueOf(n)if len(n2)!=2{//如果参数个数不为2,返回错误err:=errors.New("参数个数错误")return "",err}if reflect.TypeOf(n2[0]).String()!="int"{//如果第一个数据类型不为int型,返回错误err:=errors.New("参数类型错误")return "",err}switch n2[1].(type){//针对第二个参数的参数类型,进行讨论case string://如果为stringparams:=make([]reflect.Value,2)for k,v1:=range n2 {params[k]=reflect.ValueOf(v1)}return v.MethodByName("R").Call(params)[0].String(),nilcase int://如果为intparams:=make([]reflect.Value,2)for k,v1:=range n2{params[k]=reflect.ValueOf(v1)}return v.MethodByName("T").Call(params)[0].String(),nildefault://如果不为string或interr:=errors.New("未找到相应函数")return "",err}
}
类型顺序不同,调用不同函数
结构体及其绑定的方法
type Students struct {Name string `json:"name"`Age int
}
func (stu Students)T(n1 string,n2 int)string{return n1+"T()"+strconv.Itoa(n2)
}
func (stu Students)R(n1 int,n2 string)string{return strconv.Itoa(n1)+"R()"+n2
}
func reflecttest(n interface{},n2 ...interface{})(string,error){if len(n2)!=2{//判断参数是否为2个err:=errors.New("参数个数不正确")return "",err}v:=reflect.ValueOf(n)params:=make([]reflect.Value,2)switch n2[0].(type) {case string://判断第一个参数的类型if reflect.TypeOf(n2[1]).String()=="int"{//判断第二个参数的类型for k,v1:=range n2{params[k]=reflect.ValueOf(v1)}return v.MethodByName("T").Call(params)[0].String(),nil}else{err:=errors.New("由于第二个参数类型错误,未能找到函数")return "",err}case int://判断第一个参数类型if reflect.TypeOf(n2[1]).String()=="string"{//判断第二个参数类型for k,v1:=range n2{params[k]=reflect.ValueOf(v1)}return v.MethodByName("R").Call(params)[0].String(),nil}else{err:=errors.New("第二个参数类型错误,函数调用失败")return "",err}default:err:=errors.New("第一个参数类型错误,函数调用失败")return "",err}
}
Golang重载函数(反射模拟)相关推荐
- Golang中函数不支持重载
Golang中函数不支持重载
- error C2733: 不允许重载函数的第二个 C 链接
今日写程序,出现了如下bug: 错误: "error C2733: 不允许重载函数的第二个 C 链接" 一开始看到错误,反复查看函数声明和实现完全没问题,不知道错误出在了哪 ...
- 构造函数不能为虚/重载函数总结
构造函数不能为虚/重载函数总结 作为一个类,他最基础的成员函数就要数构造函数了.这里我们先探讨一下构造函数为什么不能是虚函数. 在解决这个问题之前,要先明白类中函数的调用方式.一个类的函数共用一个函数 ...
- gmock学习02---编写自己的Matcher与如何让编译器识别被mock的重载函数
本文目的 gmock框架中自带Matcher只针对c++内置类型,如string,int,float等等,有时候无法满足项目要求,所以需要编写自己的Matcher对象.本文介绍如何使用gmock提供的 ...
- C++:运算符重载函数之成员运算符重载函数
5.2.3 成员运算符重载函数 在C++中可以把运算符重载函数定义为某个类的成员函数,称之为成员运算符重载函数. 1. 定义成员运算符重载函数的语法形式 (1)在类的内部,定义成员运算符重载函数的格式 ...
- “pybind11::module_::def”: 未找到匹配的重载函数
"pybind11::module_::def": 未找到匹配的重载函数 #include <pybind11/pybind11.h> namespace py = p ...
- 没有与制定类型匹配的重载函数 cv::Vec<_Tp 实例
opencv 引用是,报错 没有与制定类型匹配的重载函数 cv::Vec<_Tp 实例 171个错误, 解决方法: #include <opencv2/opencv.hpp> 把下面 ...
- “std::invoke”: 未找到匹配的重载函数
"std::invoke": 未找到匹配的重载函数 代码: void RecData(SOCKETsockClient) { char revBuf[1504]; int byte ...
- 重载函数的调用匹配规则
重载函数的调用匹配,依次按照下列规则来判断: 精确匹配:参数匹配而不做转换,或者只是做微不足道的转换,如数组名到指针.函数名到指向函数的指针.T到const T: 提升匹配:即整数提升(如bool到i ...
最新文章
- MXNet 图优化与算子融合
- java线程触发_java线程
- nodejs笔记-异步编程
- c#中为datagrid添加下拉列表框
- MYSQL性能优化分享(分库分表)
- python 扫描枪_python 之serial、pyusb 使用开发
- 最优的素数判断代码(Python)是这样写出来的
- 数据结构实验 6.宗教信仰
- 基于朴素贝叶斯的定位算法
- 【UVA140】Bandwidth(最优性剪枝+全排列+思路)
- 揭密360急速免杀系列教程
- PC材料热性能五大分析方法(TG,TMA,DSC,DMA,DETA)
- 使用Git的Kdiff3解决合并冲突 显示乱码的问题
- 计算机毕业设计ssm线上学习系统8e88w系统+程序+源码+lw+远程部署
- 百度地图API V2.0 离线版本
- Mac 更新环境变量
- TeamViewer和向日葵远控软件的个人使用感觉
- 语音识别(一)——概述
- Zotero6.0来了,内容丰富,适合初学者(插件安装,翻译器更新)
- 一系列令人敬畏的.NET核心库,工具,框架和软件