go MethodByName()不能获取私有方法

在使用reflect包获取函数,并调用时,总出现这个报错:

panic: reflect: call of reflect.Value.Call on zero Value

然后测试发现,只有公有函数(首字母大写的函数)可以通过reflect.MethodByName()函数获取,私有方法是不行的。

测试如下:

定义一个接口obj

objA实现接口。

为objA分配三个方法,两个公有方法一个私有方法。

使用MethodByName()获取函数并调用。

type obj interface {
	Do()
}

type objA 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
}

func (o *objA) Do() {
	o.c = 0
	for i := 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())
	}

}

运行结果:

 

发现只有两个公有方法能够执行

私有方法是没有办法获取到的

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aiky哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值