Передача функции-члена в качестве аргумента ошибка компиляции

#go

#Вперед

Вопрос:

Я моделирую реализацию конечного автомата, описанную в этом докладе Робом Пайкомhttps://www.youtube.com/watch?v=HxaD_trXwREamp;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 amp;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:

  1. метод (m *M) foo() не соответствует сигнатуре type StateFunc func(*M) StateFunc

  2. foo это метод, у него есть приемник *M , вы не можете использовать его без приемника.

мое предложение состоит в том, чтобы изменить foo :

 func foo(*M) StateFunc {
    return nil
}