package main
import (
"errors"
"fmt"
"reflect"
)
type T struct{}
func (t *T) Do() {
fmt.Println("hello")
}
func (t *T) DoArgs(a int, b string) {
fmt.Println("hello"+b, a)
}
func (t *T) DoWithReturn() (string, error) {
return "hello", errors.New("new error")
}
func main() {
t := &T{}
// 调用无参数方法
reflect.ValueOf(t).MethodByName("Do").Call(nil)
// 调用有参数方法
reflect.ValueOf(t).MethodByName("DoArgs").Call([]reflect.Value{reflect.ValueOf(1111), reflect.ValueOf("world")})
// 调用有返回的方法
ret := reflect.ValueOf(t).MethodByName("DoWithReturn").Call(nil)
fmt.Printf("strValue: %[1]v\nerrValue: %[2]v\nstrType: %[1]T\nerrType: %[2]T\n", ret[0], ret[1].Interface().(error))
defer func() {
if err := recover(); err != nil {
fmt.Printf("cacth panic, err: %+v\n", err)
}
}()
// 调用一个不存在的方法会产生panic
reflect.ValueOf(t).MethodByName("None").Call(nil)
}
Output:
image.png
网友评论