在使用reflect包获取函数,并调用时,总出现这个报错:
paniphpc: reflect: call of reflect.Value.Call on zero Value
然后测试发现,只有公有函数(首字母大写的函数)可以通过reflect.MethodByName()函数获取,私有方法是不行的。
测试如下:
定义一个接口obj
objA实现接口。
为objA分配三个方法,两个公有方法一个私有方法。
使用MethodByName()获取函数并调用。
type obj interface { Do() } type objA开发者_Go开发 struct { a []int b []int c int } var N int = 1000 func NewObjA() (o *objA) { o = &objA{} rand.Seed(time.Now().UnixNano()) o.a = make([]int, N) o.b = make([]int, N) for i := 0; i < N; i++ { o.a[i] = rand.Intn(256) o.b[i] = rand.Intn(256) } return } fjavascriptunc (o *objA) Do() { o.c = 0 for ijs := range o.a { o.c编程客栈 += o.a[i] * o.b[i] % 256 } } func (o *objA) do() { o.c = 0 for i := range o.a { o.c += o.a[i] * o.b[i] % 256 } } func (o *objA) Do2() int{ o.c = 0 for i := range o.a { o.c += o.a[i] * o.b[i] % 256 } return o.c } func main() { a := obj(NewObjA()) v:=reflect.ValueOf(a) if f1 := v.MethodByName("Do"); f1.IsValid() { f1.Call([]reflect.Value{}) fmt.Println("成功执行 Do") } if f2 := v.MethodByName("do"); f2.IsValid() { f2.Call([]reflect.Value{}) fmt.Println("成功执行 do") } if f2 := v.MethodByName("Do2"); f2.IsValid() { f2.Call([]reflect.Value{}) fmt.Println("成功执行 Do2,结果 ") } fmt.Println("方法数量为:",v.NumMethod()) for i:=0;i< v.NumMethod();i++{ f:=v.Method(i) fmt.Println("方法",i,":",f.Type()) } }
运行结果:
发现只有两个公有方法能够执行
私有方法是没有办法获取到的
到此这篇关于go MethodByName()不能获取私有方法的解决的文章就介绍到这了,更多相关go MethodByName()不能获取私有方法内容请搜索我们以前的文章或继续浏览下面的相python关文章希望大家以后多多支持我们!
精彩评论