抱歉,我再次发布了我的问题。
在我提出问题之前,我已经阅读了解决方案。我认为它无法帮助我,因为我的问题是如何将函数作为参数传递?我不想调用它。
我只是想把它传递给另一个我无法编辑的功能(或者我不想编辑),我想用一个字符串变量指向函数
funcName := "Go"
m.set(t.funcName)
我认为这与此问题Call a Struct and its Method by name in Go?
不同例如
我的功能如下:
type Context struct{}
type myclass struct{}
type Handler func (c *Context)
func (r *myclass) set(ch Handler) {
}
我可以这样使用:
type testclass struct {}
func (t *testclass) Go(c *Context){
println("Hello");
}
t := &testclass{}
m := &myclass{}
m.set(t.Go)
我的问题是
type testclass struct{}
func (t *testclass) Go(c *Context){
println("Hello");
}
t := &testclass{}
m := &myclass{}
funcName := "Go"
m.set(t.funcName)
任何方式都可以做到这一点?
反映?或者什么?
如果不可能,还有其他方法可以做到吗?
感谢
答案 0 :(得分:0)
您可以使用反射包按名称获取方法。这是一个获得Handler
名称的函数:
func handlerByName(v interface{}, name string) (Handler, error) {
m := reflect.ValueOf(v).MethodByName(name)
if !m.IsValid() {
return nil, errors.New("method not found")
}
h, ok := m.Interface().(func(*Context))
if !ok {
return nil, errors.New("method is not a handler")
}
return h, nil
}
以下是如何使用该功能:
h, err := handlerByName(t, "Go")
if err != nil {
// handle error
}
m.set(h)
请注意,handlerByName返回的函数是原始函数周围的反射包装器(感谢@OneOfOne指出这一点)。与直接调用函数相比,调用包装器的速度很慢。