通过reflect对象实现办法的调用分三步:
- 第一步:通过接口变量获取反射对象(通过valueOf实现)
- 第二步:获取对应的办法对象(能够通过MathodByName()获取)
- 第三步:将办法对象进行调用: Call(),这个函数须要反射对象须要的参数列表,没有能够传nil或者空的切片。
具体代码例子如下(蕴含了无参和有参2中状况):
package mainimport ( "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