共计 860 个字符,预计需要花费 3 分钟才能阅读完成。
通过 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
正文完