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

 更新时间:2023年02月02日 11:01:55   作者:Aiky哇  
本文主要介绍了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())
	}
 
}

运行结果:

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

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

到此这篇关于go MethodByName()不能获取私有方法的解决的文章就介绍到这了,更多相关go MethodByName()不能获取私有方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go习惯用法(多值赋值短变量声明赋值简写模式)基础实例

    Go习惯用法(多值赋值短变量声明赋值简写模式)基础实例

    本文为大家介绍了Go习惯用法(多值赋值,短变量声明和赋值,简写模式、多值返回函数、comma,ok 表达式、传值规则)的基础实例,帮大家巩固扎实Go语言基础
    2024-01-01
  • GO如何模拟流操作实现示例探究

    GO如何模拟流操作实现示例探究

    这篇文章主要为大家介绍了GO如何模拟流操作实现示例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 使用go net实现简单的redis通信协议

    使用go net实现简单的redis通信协议

    本文主要介绍了go net实现简单的redis通信协议,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Go 结构体、数组、字典和 json 字符串的相互转换方法

    Go 结构体、数组、字典和 json 字符串的相互转换方法

    今天小编就为大家分享一篇Go 结构体、数组、字典和 json 字符串的相互转换方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • 一文详解Golang中的切片数据类型

    一文详解Golang中的切片数据类型

    这篇文章主要介绍了一文详解Golang中的切片数据类型,切片是一个种特殊的数组。是对数组的一个连续片段的引用,所以切片是一个引用类型
    2022-09-09
  • go中Excelize处理excel表实现带数据校验的文件导出

    go中Excelize处理excel表实现带数据校验的文件导出

    本文主要介绍了go中Excelize处理excel表实现带数据校验的文件导出,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • golang 实现对Map进行键值自定义排序

    golang 实现对Map进行键值自定义排序

    这篇文章主要介绍了golang 实现对Map进行键值自定义排序,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • golang中数组与切片的区别详析

    golang中数组与切片的区别详析

    数组是固定长度,常量,切片长度是可以改变,所以是一个可变的数组,下面这篇文章主要给大家介绍了关于golang中数组与切片区别的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • 详解Golang语言HTTP客户端实践

    详解Golang语言HTTP客户端实践

    本文主要介绍了Golang语言HTTP客户端实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Golang高效解析和生成XML的示例详解

    Golang高效解析和生成XML的示例详解

    这篇文章将从Golang中处理XML的基本概念开始,详细介绍如何读取和解析XML文件,然后转向如何创建和输出XML数据,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01

最新评论