通过名称调用其他包中的方法?

huangapple go评论75阅读模式
英文:

Call method in other package by name?

问题

我正在尝试使用反射包中的方法来调用另一个包中的方法,但我不确定具体该如何做。

目前我尝试的是:

reflect.ValueOf(controller).MethodByName(action_name).Call()

(其中controller是另一个包)

有什么想法吗?

英文:

I'm trying to call a method in another package by the name of the method (using the reflect package) but I'm not sure exactly how to do it.

What I'm trying so far is,

reflect.ValueOf(controller).MethodByName(action_name).Call()

(where controller is the other package)

Any ideas?

答案1

得分: 2

你可以使用pkg/reflect来实现这个功能。为了使其工作,包需要成为一等公民,但实际上它们并不是。

你最好的选择是将你想要访问的函数存储在map[string]interface{}中,并在map中查找函数:

func Foo() { println("foo?") }

m := map[string]interface{}{
    "foo": Foo,
}

f := m["foo"].(func())
f()

这样可以通过m["foo"]来获取函数,并将其转换为func()类型,然后调用该函数。

英文:

You can't do this using pkg/reflect. For this to work, packages would need to be first class citizens, which they are not.

Your best bet is to store the functions you want to access in a map[string]interface{} and look up
the function in the map:

func Foo() { println("foo?") }

m := map[string]interface{}{
    "foo": Foo
}

f := m["foo"].(func())
f()

huangapple
  • 本文由 发表于 2013年12月21日 03:59:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/20711067.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定