如何使用golang将struct的方法作为参数传递给另一个函数

时间:2016-03-07 05:26:23

标签: pointers go struct parameters func

抱歉,我再次发布了我的问题。

在我提出问题之前,我已经阅读了解决方案。我认为它无法帮助我,因为我的问题是如何将函数作为参数传递?我不想调用它。

我只是想把它传递给另一个我无法编辑的功能(或者我不想编辑),我想用一个字符串变量指向函数

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)

任何方式都可以做到这一点?

反映?或者什么?

如果不可能,还有其他方法可以做到吗?

感谢

1 个答案:

答案 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)

playground example

请注意,handlerByName返回的函数是原始函数周围的反射包装器(感谢@OneOfOne指出这一点)。与直接调用函数相比,调用包装器的速度很慢。