脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Golang - go MethodByName()不能获取私有方法的解决

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

2023-03-16 14:01Aiky哇 Golang

本文主要介绍了go MethodByName()不能获取私有方法的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

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

测试如下:

定义一个接口obj

objA实现接口。

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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 MethodByName()不能获取私有方法内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://aikysay.blog.csdn.net/article/details/123554837

延伸 · 阅读

精彩推荐
  • Golanggolang时间字符串和时间戳转换的案例

    golang时间字符串和时间戳转换的案例

    这篇文章主要介绍了golang时间字符串和时间戳转换的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    一根烂笔头10912021-03-10
  • Golanggo日志库中的logrus

    go日志库中的logrus

    这篇文章主要介绍了go日志库中的logrus主要包括go日志库logrus的安装和使用,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...

    zzxiaoma5882022-11-11
  • GolangK8s部署发布Golang应用程序的实现方法

    K8s部署发布Golang应用程序的实现方法

    本文主要介绍了K8s部署发布Golang应用程序的实现方法,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧...

    luoguo8002021-08-15
  • Golang解决golang sync.Wait()不执行的问题

    解决golang sync.Wait()不执行的问题

    这篇文章主要介绍了解决golang sync.Wait()不执行的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    Tangs_6422021-03-18
  • Golanggolang语言map全方位介绍

    golang语言map全方位介绍

    本文主要介绍了golang语言map全方位介绍,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    九江董熙7722022-08-28
  • Golang详解go-admin在线开发平台学习(安装、配置、启动)

    详解go-admin在线开发平台学习(安装、配置、启动)

    这篇文章主要介绍了go-admin在线开发平台学习(安装、配置、启动),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友...

    happlyfox5772021-03-28
  • Golang深入剖析Go语言编程中switch语句的使用

    深入剖析Go语言编程中switch语句的使用

    这篇文章主要介绍了Go语言编程中switch语句的使用,是Go语言入门学习中的基础知识,需要的朋友可以参考下 ...

    脚本之家3872020-04-28
  • GolangGin 框架快速创建静态文件下载Web服务

    Gin 框架快速创建静态文件下载Web服务

    本文主要介绍了Gin 框架快速创建静态文件下载Web服务,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    尹东勋11522022-01-22