如何在结构上调用变量方法

时间:2014-07-14 16:20:57

标签: go

我想在像这个例子

这样的结构上调用变量方法
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? 
}

回复。

1 个答案:

答案 0 :(得分:4)

DHH,您是否正在将Rails移植到Go :)?

除了笑话,这正是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非常强大,也是拍摄自己的好方法,所以过度使用它永远不是一个好主意。