我想在像这个例子
这样的结构上调用变量方法type controller struct{}
func (c *controller) Index() {
fmt.Println("index controller")
}
func invokeIt(action string) {
(&controller{}).action // don't work duh
(&controller{})["action"] // this is Go not js
// how can I invoke it?
}
回复。
答案 0 :(得分:4)
除了笑话,这正是reflect
的用途。例如:
type Foo struct{}
func (Foo) FooM() { fmt.Println("Foom") }
func main() {
foo := Foo{}
reflect.ValueOf(foo).MethodByName("FooM").Call(nil)
}
游乐场:http://play.golang.org/p/5ZGwlHLEmj
编辑:一个更惯用的方法是使用接口,(正如其他人提出的,但后来删除了他们的答案)。因此,如果您想要定义可以执行CRUD的内容,那么在Go中您通常会使用
type Resources interface {
Index()
New()
Show(id int)
// ...
}
也许是一个Invoke
方法,以便使用上面的reflect
在这个东西上调用非标准方法。 reflect
非常强大,也是拍摄自己的好方法,所以过度使用它永远不是一个好主意。