今天给大家说一说关于go语言方法重载的方法,具体如下:

    首先认清重载函数的定义

    1. 1:函数参数个数不同
    2. 2:函数参数类型不同,或者类型顺序不同
    3. Go语言本身不支持函数的重载,所以,我们利用反射+switch进行模拟反射,动态进行函数调用。

    根据函数参数的个数不同,实现函数重载

    首先声明结构体,并绑定两个参数

    1. type Students struct {
    2. Name string `json:"name"`
    3. Age int
    4. }
    5. func (stu Students)T(n1 int,n2 int)int{//方法需要传递两个参数
    6. return n1+n2
    7. }
    8. func (stu Students)R(n1 int)int{//方法需要传递一个参数
    9. return n1
    10. }

    实现动态调用方法的函数

    1. func reflecttest(n interface{},n2 ...interface{})(int,error){
    2. v:=reflect.ValueOf(n)
    3. switch len(n2) {
    4. case 1://如果传参为一个值
    5. params:=make([]reflect.Value,1)
    6. params[0]=reflect.ValueOf(n2[0])//注意传参时,需要将值的类型转化为value类型
    7. return int(v.MethodByName("R").Call(params)[0].Int()),nil//注意,返回的值以数组形式进行返回,再将返回的值转化为int64,再强制转化为int型数据
    8. case 2:如果参数为两个
    9. params:=make([]reflect.Value,2)
    10. for k,v1:=range n2{
    11. params[k]=reflect.ValueOf(v1)
    12. }
    13. return int(v.MethodByName("T").Call(params)[0].Int()),nil
    14. default://如果传参的数量不是一个或两个。
    15. err:=errors.New("调用函数不存在")
    16. return 0,err//返回错误
    17. }
    18. }
    1. 根据函数参数类型的不同,调用不同的函数
    2. 结构体及其绑定的方法
    3. type Students struct {
    4. Name string `json:"name"`
    5. Age int
    6. }
    7. func (stu Students)T(n1 int,n2 int)string{
    8. return n1+"T()"+strconv.Itoa(n2)
    9. }
    10. func (stu Students)R(n1 int,n2 string)string{
    11. return strconv.Itoa(n1)+"R()"+n2
    12. }
    13. func reflecttest(n interface{},n2 ...interface{})(string,error){
    14. v:=reflect.ValueOf(n)
    15. if len(n2)!=2{//如果参数个数不为2,返回错误
    16. err:=errors.New("参数个数错误")
    17. return "",err
    18. }
    19. if reflect.TypeOf(n2[0]).String()!="int"{//如果第一个数据类型不为int型,返回错误
    20. err:=errors.New("参数类型错误")
    21. return "",err
    22. }
    23. switch n2[1].(type){//针对第二个参数的参数类型,进行讨论
    24. case string://如果为string
    25. params:=make([]reflect.Value,2)
    26. for k,v1:=range n2 {
    27. params[k]=reflect.ValueOf(v1)
    28. }
    29. return v.MethodByName("R").Call(params)[0].String(),nil
    30. case int://如果为int
    31. params:=make([]reflect.Value,2)
    32. for k,v1:=range n2{
    33. params[k]=reflect.ValueOf(v1)
    34. }
    35. return v.MethodByName("T").Call(params)[0].String(),nil
    36. default://如果不为string或int
    37. err:=errors.New("未找到相应函数")
    38. return "",err
    39. }
    40. }
    1. 类型顺序不同,调用不同函数
    2. 结构体及其绑定的方法
    3. type Students struct {
    4. Name string `json:"name"`
    5. Age int
    6. }
    7. func (stu Students)T(n1 string,n2 int)string{
    8. return n1+"T()"+strconv.Itoa(n2)
    9. }
    10. func (stu Students)R(n1 int,n2 string)string{
    11. return strconv.Itoa(n1)+"R()"+n2
    12. }
    13. func reflecttest(n interface{},n2 ...interface{})(string,error){
    14. if len(n2)!=2{//判断参数是否为2个
    15. err:=errors.New("参数个数不正确")
    16. return "",err
    17. }
    18. v:=reflect.ValueOf(n)
    19. params:=make([]reflect.Value,2)
    20. switch n2[0].(type) {
    21. case string://判断第一个参数的类型
    22. if reflect.TypeOf(n2[1]).String()=="int"{//判断第二个参数的类型
    23. for k,v1:=range n2{
    24. params[k]=reflect.ValueOf(v1)
    25. }
    26. return v.MethodByName("T").Call(params)[0].String(),nil
    27. }else{
    28. err:=errors.New("由于第二个参数类型错误,未能找到函数")
    29. return "",err
    30. }
    31. case int://判断第一个参数类型
    32. if reflect.TypeOf(n2[1]).String()=="string"{//判断第二个参数类型
    33. for k,v1:=range n2{
    34. params[k]=reflect.ValueOf(v1)
    35. }
    36. return v.MethodByName("R").Call(params)[0].String(),nil
    37. }else{
    38. err:=errors.New("第二个参数类型错误,函数调用失败")
    39. return "",err
    40. }
    41. default:
    42. err:=errors.New("第一个参数类型错误,函数调用失败")
    43. return "",err
    44. }
    45. }