首页 > 编程知识 正文

golang 函数重载

时间:2023-05-03 09:52:26 阅读:262950 作者:1114

首先认清重载函数的定义
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 refle快三三期必中口诀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}}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。