英文:
How can I invoke a variable method on a struct
问题
我想在一个结构体上调用一个变量方法,就像这个例子一样:
type controller struct{}
func (c *controller) Index() {
fmt.Println("index controller")
}
func invokeIt(action string) {
(&controller{}).action // 这样不起作用
(&controller{})["action"] // 这是Go不是js
// 我该如何调用它?
}
谢谢回复。
英文:
I want to invoke a variable method on a struct like this example
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?
}
thx for the replies.
答案1
得分: 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)
}
Playground: http://play.golang.org/p/5ZGwlHLEmj
**编辑:**更符合惯用方式的方法是使用接口(正如其他人提出的,但他们已经删除了他们的答案)。所以,如果你想定义一个可以执行CRUD操作的东西,在Go中通常会这样做:
type Resources interface {
Index()
New()
Show(id int)
// ...
}
然后,可以使用类似上面使用reflect
的方式来调用这个东西上的非标准方法,也可以在这个东西上定义一个Invoke
方法。reflect
非常强大,但也容易踩坑,所以过度使用它是不明智的。
英文:
DHH, are you porting Rails to Go ?
Jokes aside, this is exactly what reflect
is for. For example:
type Foo struct{}
func (Foo) FooM() { fmt.Println("Foom") }
func main() {
foo := Foo{}
reflect.ValueOf(foo).MethodByName("FooM").Call(nil)
}
Playground: http://play.golang.org/p/5ZGwlHLEmj
EDIT: A more idiomatic way to do it would be to use interfaces, (as someone else had proposed, but then have deleted their answer). So if you want to, say, define something that can do CRUD, in Go you'd usually go with
type Resources interface {
Index()
New()
Show(id int)
// ...
}
And maybe an Invoke
method in order to invoke non-standard methods on this thing using reflect
like above. reflect
is very powerful and also a good way to shoot yourself in the foot, so it's never a good idea to overuse it.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论