2

通过reflect对象实现方法的调用分三步:

  • 第一步:通过接口变量获取反射对象(通过valueOf实现)
  • 第二步:获取对应的方法对象(可以通过MathodByName()获取)
  • 第三步:将方法对象进行调用: Call(),这个函数需要反射对象需要的参数列表,没有可以传nil或者空的切片。

具体代码例子如下(包含了无参和有参2中情况):

package main

import (
    "fmt"
    "reflect"
)

type Person struct {
    Name   string
    Age    int
    Gender string
}

func (p Person) Say(msg string) {
    fmt.Println("hello, ", msg)
}

func (p Person) PrintInfo() {
    fmt.Printf("Name: %s, Age: %d, Gender: %s", p.Name, p.Age, p.Gender)
}
func main() {
    p1 := Person{"lokays", 19, "male"}
    value := reflect.ValueOf(p1)
    methodValue1 := value.MethodByName("PrintInfo")
    fmt.Printf("kind: %s, type: %s\n", methodValue1.Kind(), methodValue1.Type())

    //没有参数进行调用
    methodValue1.Call(nil)

    //有参数进行调用
    methodValue2 := value.MethodByName("Say")
    //这里的参数需要一个反射对象value类型的切片,说人话就是,这里需要把字符串转成反射对象
    args2 := []reflect.Value{reflect.ValueOf(":hey it's liber")}
    methodValue2.Call(args2)
}

运行结果如下:

kind: func, type: func()
Name: lokays, Age: 19, Gender: malehello,  :hey it's liber

参考:bilibili


LiberHome
409 声望1.1k 粉丝

有问题 欢迎发邮件 📩 liberhome@163.com