如何在Golang中反映对象的动态方法名称

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

How to reflect dynamic method name of an object in Golang

问题

示例

router.Get(path, handler) // 正常工作

methodStr = "Get"    
router.methodStr(path, handler) // 错误

funcs := map[string]func(){"methodStr": "Get"}
router.funcs["methodStr"](path, handler) // 错误

reflect.ValueOf(router).MethodByName("Get").Call([]reflect.Value{}) // 错误

我正在以字符串形式获取方法名。如何使用字符串名称调用路由器对象的方法?

英文:

example

router.Get(path, handler) // works fine

methodStr = "Get"    
router.methodStr(path, handler) // error

funcs := map[string]func(){"methodStr": "Get"}
router.funcs["methodStr"](path, handler) // error

reflect.ValueOf(router).MethodByName("Get").Call([]reflect.Value{}) // error

I am getting method names as strings. How to call the router object methods with string names

答案1

得分: 1

你的第一个和第二个错误不是有效的Go代码,所以我不确定你对它们有什么期望。最后一个使用反射的例子没有为需要两个参数的函数提供任何参数,这将导致程序崩溃。添加这两个参数可以正常工作:

args := []reflect.Value{
    reflect.ValueOf("path"),
    reflect.ValueOf("handler"),
}
reflect.ValueOf(router).MethodByName("Get").Call(args)

请注意,这是一个Go代码示例,用于使用反射调用router对象的Get方法,并传递两个参数。

英文:

The first two errors you have aren't valid Go, so I'm not sure what you would expect from them. The last example with reflect doesn't have any arguments for a function that requires 2, which will panic. Adding the 2 arguments works fine:

http://play.golang.org/p/mSziWdW0hn

args := []reflect.Value{
	reflect.ValueOf("path"),
	reflect.ValueOf("handler"),
}
reflect.ValueOf(router).MethodByName("Get").Call(args)

huangapple
  • 本文由 发表于 2016年1月29日 02:44:42
  • 转载请务必保留本文链接:https://go.coder-hub.com/35069528.html
匿名

发表评论

匿名网友

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

确定