gpt4 book ai didi

go - 如何从Go中的字符串方法名称调用另一个包的方法

转载 作者:IT王子 更新时间:2023-10-29 00:59:05 25 4
gpt4 key购买 nike

假设我有两个类似的包

-a

-b

a有一些这样的方法

 func TestOne() { //something }
func TestTwo() { //something }

我需要从包b 调用包a 的方法,但只能通过字符串方法名称。就像我得到字符串“TestOne”并调用方法 TestOne() 一样。我怎样才能完成。

编辑:我已阅读有关 reflect 的内容。但是 reflect 需要一个结构并且函数是该结构的成员。如果我的函数不是结构的成员怎么办?只是包中的普通方法。并且调用方法和被调用方法在不同的包中。然后呢?

注意。可能还有一些方法也有参数。

最佳答案

正如 LightWeight 在他的回答中所说,你可以使用反射。

您使用 reflect.ValueOf 方法获取类型的值。然后您可以使用 MethodByName 方法来获取函数值。获得函数值后,您可以调用 Call 方法来执行它。

代码示例

package main

import (
"fmt"
"reflect"
)

type TypeOne struct {
}

func (t *TypeOne) FuncOne() {
fmt.Println("FuncOne")
}

func (t *TypeOne) FuncTwo(name string) {
fmt.Println("Hello", name)
}

func CallFuncByName(myClass interface{}, funcName string, params ...interface{}) (out []reflect.Value, err error) {
myClassValue := reflect.ValueOf(myClass)
m := myClassValue.MethodByName(funcName)
if !m.IsValid() {
return make([]reflect.Value, 0), fmt.Errorf("Method not found \"%s\"", funcName)
}
in := make([]reflect.Value, len(params))
for i, param := range params {
in[i] = reflect.ValueOf(param)
}
out = m.Call(in)
return
}

func main() {
t1 := &TypeOne{}
out, err := CallFuncByName(t1, "FuncOne")
if err != nil {
panic(err)
}
//Return value
_ = out
out, err = CallFuncByName(t1, "FuncTwo", "monkey")
if err != nil {
panic(err)
}
//Return value
_ = out
}

关于go - 如何从Go中的字符串方法名称调用另一个包的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33006628/

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