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

标签 go

假设我有两个类似的包

-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/

相关文章:

Golang在模板中用逗号分隔项目

关闭 Go channel 时的​​ Go 竞争条件

pointers - 在 Golang 错误中从一个指针类型转换为另一种指针类型

API 设计 - 一个域上的应用程序,不同域上的 api。如何在不传递用户 ID 的情况下检索用户特定数据

arrays - 在 Golang 中定义包含 slice 的数组映射

http - Golang - 劫持参数

algorithm - 将平面列表加权为正态分布

json - Golang-解析嵌套的json值

mongodb - 如何使用 mgo 包在 go 中编写 $subtract mongo 查询?

parameters - Go 如何查看产品类型