• 首先认清重载函数的定义
    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重载函数(反射模拟)相关推荐

  1. Golang中函数不支持重载

    Golang中函数不支持重载

  2. error C2733: 不允许重载函数的第二个 C 链接

    今日写程序,出现了如下bug: 错误: "error C2733: 不允许重载函数的第二个 C 链接"     一开始看到错误,反复查看函数声明和实现完全没问题,不知道错误出在了哪 ...

  3. 构造函数不能为虚/重载函数总结

    构造函数不能为虚/重载函数总结 作为一个类,他最基础的成员函数就要数构造函数了.这里我们先探讨一下构造函数为什么不能是虚函数. 在解决这个问题之前,要先明白类中函数的调用方式.一个类的函数共用一个函数 ...

  4. gmock学习02---编写自己的Matcher与如何让编译器识别被mock的重载函数

    本文目的 gmock框架中自带Matcher只针对c++内置类型,如string,int,float等等,有时候无法满足项目要求,所以需要编写自己的Matcher对象.本文介绍如何使用gmock提供的 ...

  5. C++:运算符重载函数之成员运算符重载函数

    5.2.3 成员运算符重载函数 在C++中可以把运算符重载函数定义为某个类的成员函数,称之为成员运算符重载函数. 1. 定义成员运算符重载函数的语法形式 (1)在类的内部,定义成员运算符重载函数的格式 ...

  6. “pybind11::module_::def”: 未找到匹配的重载函数

    "pybind11::module_::def": 未找到匹配的重载函数 #include <pybind11/pybind11.h> namespace py = p ...

  7. 没有与制定类型匹配的重载函数 cv::Vec<_Tp 实例

    opencv 引用是,报错 没有与制定类型匹配的重载函数 cv::Vec<_Tp 实例 171个错误, 解决方法: #include <opencv2/opencv.hpp> 把下面 ...

  8. “std::invoke”: 未找到匹配的重载函数

    "std::invoke": 未找到匹配的重载函数 代码: void RecData(SOCKETsockClient) { char revBuf[1504]; int byte ...

  9. 重载函数的调用匹配规则

    重载函数的调用匹配,依次按照下列规则来判断: 精确匹配:参数匹配而不做转换,或者只是做微不足道的转换,如数组名到指针.函数名到指向函数的指针.T到const T: 提升匹配:即整数提升(如bool到i ...

最新文章

  1. MXNet 图优化与算子融合
  2. java线程触发_java线程
  3. nodejs笔记-异步编程
  4. c#中为datagrid添加下拉列表框
  5. MYSQL性能优化分享(分库分表)
  6. python 扫描枪_python 之serial、pyusb 使用开发
  7. 最优的素数判断代码(Python)是这样写出来的
  8. 数据结构实验 6.宗教信仰
  9. 基于朴素贝叶斯的定位算法
  10. 【UVA140】Bandwidth(最优性剪枝+全排列+思路)
  11. 揭密360急速免杀系列教程
  12. PC材料热性能五大分析方法(TG,TMA,DSC,DMA,DETA)
  13. 使用Git的Kdiff3解决合并冲突 显示乱码的问题
  14. 计算机毕业设计ssm线上学习系统8e88w系统+程序+源码+lw+远程部署
  15. 百度地图API V2.0 离线版本
  16. Mac 更新环境变量
  17. TeamViewer和向日葵远控软件的个人使用感觉
  18. 语音识别(一)——概述
  19. Zotero6.0来了,内容丰富,适合初学者(插件安装,翻译器更新)
  20. 一系列令人敬畏的.NET核心库,工具,框架和软件

热门文章

  1. Rabbitmq学习笔记教程-尚硅谷
  2. HTML:利用:after伪元素清除浮动
  3. mysql id guid_Guid与id区别
  4. 最后剩下的一张骨牌的编号
  5. Redis主从复制设置
  6. mysql去除重复数据保留一条_MySQL中删除重复数据只保留一条
  7. 今日软件分享:可以自动生成自画像的软件
  8. ffmpeg 后台运行
  9. Java8之函数式接口及常用函数式接口
  10. django项目中xadmin详细使用教程