go-bt
- title
- go-bt
- type
- toolbox
- summary
- Минималистичная библиотека деревьев поведения для Go с неблокирующими тиками и типизированным generic-blackboard
- tags
- golang, behavior-trees, game-ai, task-automation
- language
- Go
- license
- Unknown
- created
- 2026-04-09
- updated
- 2026-04-09
- lang
- ru
- translation_of
- go-bt
- source_updated
- 2026-04-09
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Минималистичная библиотека behavior-tree для Go. Спроектирована для фоновых воркеров, игрового ИИ, автоматизации задач и асинхронной логики. Узлы мгновенно возвращают состояние (кооперативная многозадачность), а не блокируются через goroutine'ы или sleep'ы.
Как устроена
Метод Run каждого узла возвращает одно из трёх целых чисел: 1 (успех), 0 (выполняется), -1 (ошибка). Супервизор тикает дерево с настраиваемым интервалом, и каждый тик проходит по дереву без блокировок.
Основная абстракция - BTContext[T], generic-контекст, который встраивает стандартный context.Context из Go (для отмены и таймаутов) и несёт в себе типизированный blackboard - структуру общего состояния, которую узлы читают и модифицируют.
Типы узлов:
- Composites -
Selector(пробует дочерние узлы, пока один не завершится успехом),Sequence(выполняет дочерние узлы, пока один не завершится ошибкой),MemSequence(продолжает с места, где остановился) - Decorators -
Inverter,Optional(проглатывает ошибки),Timeout,Retry,Repeat - Leaves -
Condition(проверяет blackboard),Action(выполняет работу),Sleep(неблокирующее ожидание)
Использование
type WorkerState struct {
IsConnected bool
PendingTasks int
}
tree := composite.NewSelector(
composite.NewSequence(
leaf.NewCondition(func(bb *WorkerState) bool {
return bb.IsConnected
}),
leaf.NewAction(func(ctx *core.BTContext[WorkerState]) int {
ctx.Blackboard.PendingTasks--
return 1
}),
),
)
supervisor := core.NewSupervisor(tree, 100*time.Millisecond, func(err any) {
println("recovered:", err)
})
wg := supervisor.Start(btCtx)
wg.Wait()
Тестирование
Библиотека внедряет часы в BTContext, поэтому узлы, работающие со временем (Timeout, Sleep), можно тестировать искусственной перемоткой времени - ждать в реальном времени не нужно.
Ограничения
Очень свежий проект (апрель 2026 года, около 73 звёзд). Лицензия пока не указана. Нет параллельного узла для одновременного выполнения дочерних узлов. Из-за stateless-архитектуры композитных узлов MemSequence остаётся единственным способом возобновить выполнение внутри последовательности между тиками.
Для data-oriented управления сущностями в связке с деревьями поведения на сущность смотрите Ark - обе библиотеки минималистичны и близки по философии дизайна.