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我更新了代码以确保安全。感谢您的反馈。还要注意,由于添加了包装器,使用反射调用方法/函数的速度非常慢。