gpt4 book ai didi

go - 具有指针类型接收器的方法不会在反射中列出

转载 作者:数据小太阳 更新时间:2023-10-29 03:42:13 31 4
gpt4 key购买 nike

我试图通过使用反射来调用一个类型的所有方法来概括我的代码。它简单明了,但存在一个问题,reflection.TypeOf(T).NumMethods(或其他方法)忽略了使用接收器类型作为指针的方法。例如,这段小代码将打印 1 而不是 2:

package main

import (
"fmt"
"reflect"
)

type Foo struct {}

func (f Foo) Bar() {}

func (f *Foo) Baz() {}

func main() {
obj := Foo{}
fmt.Println(reflect.TypeOf(obj).NumMethod())
}

您可以在 playground 中运行.它打印 1 因为 Bar 方法。如果从 Baz 中删除指针 (*),它将打印 2。

我的问题是如何列出所有方法而不考虑接收器类型。

谢谢

最佳答案

获取指向具有指针类型接收器的方法的指针。如果您想使用反射按名称调用方法,这里是代码。

package main

import (
"fmt"
"reflect"
)

type Foo struct{}

func (f Foo) Bar() {
fmt.Println("Inside Bar")
}

func (f *Foo) Baz() {
fmt.Println("Inside Baz")
}

func main() {
rfl := reflect.ValueOf(&Foo{})
v := rfl.MethodByName("Baz")

results := v.Call(nil)
fmt.Printf("%#v\n", results)
fmt.Println(reflect.TypeOf(&Foo{}).NumMethod())
}

Go Playground

关于go - 具有指针类型接收器的方法不会在反射中列出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49564287/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com