go MethodByName()不能获取私有方法的解决
作者:Aiky哇 发布时间:2024-04-30 10:07:35
标签: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())
}
}
运行结果:
发现只有两个公有方法能够执行
私有方法是没有办法获取到的
来源:https://aikysay.blog.csdn.net/article/details/123554837


猜你喜欢
- 获取航线信息并且制作成图航线信息航线信息查询网站本次实例使用的航班号为 CES5496查询后在network中可以寻找到如下内容https:
- Mint UI 是饿了么开源的,基于 Vue.js 的移动端组件库。关于Mint UI,有文档不够准确详尽,组件略显粗糙,功能不够完善等问题
- 问题:不同版本提交的城市文件夹数量固定,怎样确定本版本成果中缺少了哪些城市?背景:已有参照文件作为标准,利用取差集的方法#-*- codin
- 前言:以往看到我博客的小伙伴可能都知道,我的前言一般都是吐槽和讲废话环节,哈哈哈哈。今天难得休息,最近可真是太忙了,博主已经连续一年都在99
- 匿名函数lambda表达式 什么是匿名函数?匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lamb
- 前言今天就来学习一下图形设计界面的美化,首先我们知道 QtDesigner设计出来的界面默认是不太怎么美观的。所以在以后的实际开发中很多界面
- 题目请设计并实现一款主机端口扫描程序。程序根据用户输入的域名或IP地址,可以查询该主机的开放的端口号。 例如:并有一定的异常处理参考code
- 为了防止某些别有用心的人从外部访问数据库,盗取数据库中的用户姓名、密码、信用卡号等其他重要信息,在我们创建数据库驱动的解决方案时,我们首先需
- 用途:将UTF-8编码汉字转换为GB2312码,兼容英文和数字版权:虽说是原创,其实也参考了別人的部分算法asp源代码:<% 
- 作者:做梦的人(小姐姐)出处:https://www.cnblogs.com/chongyou/因为最近在做平台,发现有同事,使用djang
- 原理:建一个栈,每次碰到一个新标签,就与栈顶的标签配对,如果配对,栈顶的标签就出栈,如果不配对,这个新标签就进栈,最终,栈如果是空的,说明所
- 概述Go 的并发模型与其他语言不同,虽说它简化了并发程序的开发难度,但如果不了解使用方法,常常会遇到 goroutine 泄露的问题。虽然
- 【原文地址】New "Orcas" Language Feature: Extension Methods【原文发表日期
- 1,jdk配置由于jdk官网的链接不直接支持wget,可以使用下面的方法下载jdk,其中jdk版本为jdk1.8.0_91:wget --n
- ExpiresAbsolute 属性指定缓存于浏览器中的页的到期日期和时间语法Response.ExpiresAbsolute [
- 当然我们可以在后台中获取参数的值,然后在前台js代码中获取变量的值,具体做法请参考我的这篇文章:JavaScript获取后台C#变量以及调用
- 因为工作原因,需要定期清理某个文件夹下面创建时间超过1年的所有文件,所以今天集中学习了一下Python对于本地文件及文件夹的操作。网上 这篇
- MySQL 与 Elasticsearch 数据不对称问题解决办法jdbc-input-plugin 只能实现数据库的追加,对于 elast
- 看着自己少得可怜的访问量,突然有一个想用爬虫刷访问量的想法,主要也是抱着尝试的心态,学习学习。其实市面上有一些软件可以代刷流量 比如 流量精
- 前言PyCharm是一种Python 的IDE工具(集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,内部