将成员函数作为参数传递时编译错误

时间:2019-03-29 03:51:59

标签: go

我正在建模Rob Pike https://www.youtube.com/watch?v=HxaD_trXwRE&t=1830s在本次演讲中概述的状态机实现 而且我无法将其编译。我提供了一个失败的小样本。

调用:m:= New(foo) 失败

./main.go:31:11: undefined: foo

我尝试过

      m := New(M.foo)
      m := New(foo(*M))

我不知道正确的语法。

package main

type StateFunc func(*M) StateFunc

type M struct {
    start StateFunc
}

func New(start StateFunc) *M {
    return &M{
        start: start,
    }
}

func (m *M) foo() StateFunc {
    return nil
}

func (m *M) Start() {
    go m.run()
}

func (m *M) run() {
    state := m.start
    for state != nil {
        state = state(m)
    }
}

func main() {
    m := New(foo)
}

我希望它可以编译,但是我不知道使它起作用的正确语法。

1 个答案:

答案 0 :(得分:2)

  1. 方法(m *M) foo()type StateFunc func(*M) StateFunc的签名不匹配

  2. foo是一种方法,它有一个接收者*M,没有接收者就不能使用它。

我的建议是修改foo

func foo(*M) StateFunc {
    return nil
}