Я хочу содержать все мои команды на карте и карту от команды до функции, выполняющей задание (только стандартная таблица рассылки). Я начал со следующим кодом:Использование рекурсивных ссылок в Go
package main
import "fmt"
func hello() {
fmt.Print("Hello World!")
}
func list() {
for key, _ := range whatever {
fmt.Print(key)
}
}
var whatever = map[string](func()) {
"hello": hello,
"list": list,
}
Однако он не компилируется, поскольку существует рекурсивная ссылка между функцией и структурой. Пытаться переслать-объявить, что функция завершилась с ошибкой об повторном определении, когда она определена, и карта находится на верхнем уровне. Как вы определяете структуры, подобные этому, и инициализируете их на верхнем уровне без, используя функцию init()
.
Я не вижу хороших объяснений в определении языка.
- Переходящая ссылка, которая существует, предназначена для «внешних» функций, и она не компилируется, когда я пытаюсь переслать-объявить функцию.
- Я не нахожу способ переадресации переменной.
Обновление: Я ищу решение, которое не требует, чтобы вы заполнить переменную явно при запуске программы, ни в init()
функции. Не уверен, что это вообще возможно, но работает на всех сопоставимых языках, о которых я знаю.
Обновление 2:FigmentEngine предложил подход, который я дал в качестве ответа ниже. Он может обрабатывать рекурсивные типы, а также допускать статическую инициализацию карты всех команд.
Я понимаю ваше намерение и почему вы хотите, чтобы golang сделал это возможным. однако ИМХО это похоже на плохую практику, так как list() находится в контейнере, и он знает, в каком контейнере он находится, infact он будет работать только для этого конкретного контейнера - я думаю, вам нужна некоторая инверсия зависимости. все функции, когда они становятся нетривиальными, потребуют некоторых параметров для работы. Поэтому убивайте двух зайцев одним камнем и все функции требуют параметра контекста, это всегда может включать ссылку на контейнер и позволяет поддерживать повторное использование и несколько диспетчеров. – FigmentEngine
Хм ... не думал об этом ... хорошая идея ... –
Эх, это означало бы, что вам нужно определить рекурсивный тип; что это вообще возможно? Знаете, это не действительно μ-исчисление. –