gpt4 book ai didi

go - Golang中如何动态调用结构体的所有方法?

转载 作者:行者123 更新时间:2023-12-03 03:15:43 25 4
gpt4 key购买 nike

我正在构建一个库,一旦将方法添加到结构中,我们希望使用某种方法列表自动调用它们。

我想通过调用此处链接的所有转储方法来构建此处的工作 How to dump methods of structs in Golang? .

package main

import (
"fmt"
"reflect"
)

type Foo struct {
Prop string
}

func (f Foo) Bar(i int) {
fmt.Println("Called from Foo.Bar()")
}

func (f Foo) Baz(i int) {
fmt.Println("Called from Foo.Baz()")
}

func (f Foo) Floop(i int) {
fmt.Println("Called from Foo.Floop()")
}

func main() {
fooType := reflect.TypeOf(&Foo{})

fmt.Println("--- Calling methods ---")
for i := 0; i < fooType.NumMethod(); i++ {
method := fooType.Method(i)

method.Func.Call(nil)
}
}

也可以在这里看到:https://play.golang.org/p/gNUsANjuPV0

由于 .Call() 的参数太少,这总是会出现 panic 并显示一条消息。我看不出这在结构上与此处的代码有何不同:https://play.golang.org/p/HB8yB91LRme .

最佳答案

要从类型调用该方法,您必须传递一个reflect.Value实例,该实例提供作为接收者的Foo对象< em>加上一个reflect.Value实例,提供每个函数接收的int参数:

fooType := reflect.TypeOf(&Foo{})
fooVal := reflect.ValueOf(&Foo{})
fmt.Println("--- Calling methods ---")
for i := 0; i < fooType.NumMethod(); i++ {
method := fooType.Method(i)
arg := i + 10
method.Func.Call([]reflect.Value{fooVal, reflect.ValueOf(arg)})
}

例如。请注意,如果您从调用该方法,则通过该值提供接收器,因此我们可以删除第一个参数:

    arg = i + 20
reflect.Indirect(fooVal).Method(i).Call([]reflect.Value{reflect.ValueOf(arg)})

complete example on Go playground - 但请注意,我们只需要在其方法的循环上方获取 foo 对象一次:https://play.golang.org/p/HHk_mO2KXc6这样循环中的最后一行就是:

    fooObj.Method(i).Call([]reflect.Value{reflect.ValueOf(arg)})

关于go - Golang中如何动态调用结构体的所有方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57862599/

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