Pointers 如何传递结构';将s方法作为参数转化为另一个函数使用golang
对不起,我又发帖了 在我提问之前,我已经阅读了解决方案。我认为这对我没有帮助,因为我的问题是如何将函数作为参数传递?我不想调用它 我只想把它传递给另一个我不能编辑(或者我不想编辑)的函数,我想用一个字符串变量来指向这个函数Pointers 如何传递结构';将s方法作为参数转化为另一个函数使用golang,pointers,go,struct,parameters,func,Pointers,Go,Struct,Parameters,Func,对不起,我又发帖了 在我提问之前,我已经阅读了解决方案。我认为这对我没有帮助,因为我的问题是如何将函数作为参数传递?我不想调用它 我只想把它传递给另一个我不能编辑(或者我不想编辑)的函数,我想用一个字符串变量来指向这个函数 funcName := "Go" m.set(t.funcName) 我认为这与这个问题不同 比如说 我有一个类似于: type Context struct{} type myclass struct{} type Handler func (c *Context)
funcName := "Go"
m.set(t.funcName)
我认为这与这个问题不同
比如说
我有一个类似于:
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)
有什么办法可以做到这一点吗
反思?还是什么
如果不可能,还有其他方法吗
谢谢您可以使用reflect包按名称获取方法。下面是一个函数,用于获取给定名称的
处理程序
:
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指出这一点)。与直接调用函数相比,调用包装器的速度较慢。您想做什么?为什么要这样做?您应该补充一点,这不是非常惯用(或安全)的代码。如果我们有更多关于“为什么”的上下文,OP的代码可能会避免这种情况。OP可能不是高级Go用户。为什么建议使用反射?@Volker反射对给定任务的适用性与询问者无关。@elithrar我更新了代码以确保安全。感谢您的反馈。还要注意,由于添加了包装器,使用反射调用方法/函数的速度非常慢。