为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
长风秋雁 2021-11-15 15:32:06
假设我有两个包-一种-b一有这样的一些方法 func TestOne() { //something }  func TestTwo() { //something }我需要从包b 中调用包a的方法,但只能通过字符串方法名称。就像我得到字符串“TestOne”并调用方法 TestOne() 一样。我怎样才能做到这一点。编辑: 我已经阅读了reflect。但reflect需要一个结构和函数是该结构的成员。如果我的函数不是结构的成员怎么办?只是一个包中的简单方法。并且调用方法和被调用方法在不同的包中。然后?注意。可能有一些方法也有参数。
查看完整描述

2 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

就像 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

}


查看完整回答
反对 回复 2021-11-15
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

您可以尝试在 go 中使用反射。此链接可能对您有所帮助 https://golang.org/pkg/reflect/ 和http://mikespook.com/2012/07/function-call-by-name-in-golang/


func foo() {

    // bla...bla...bla...

}

func bar(a, b, c int) {

    // bla...bla...bla...

}

funcs := map[string]interface{}{"foo":foo, "bar":bar}


查看完整回答
反对 回复 2021-11-15
  • 2 回答
  • 0 关注
  • 246 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信