Simple Finite-State Machines for Go.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Simple Finite-State Machines for Go.

View the docs here.


Here is a simple example that simulates a secure door:

import ""
import "fmt"

type Door struct {
  // The code that was used to lock the door with
  code string

// These are the states that a Door can be in:
var locked, unlocked fsm.State

// Initialize the states
locked = fsm.Actions{
  "enter-pin": func(d *Door, pin string) fsm.State {
    if pin == d.code {
      fmt.Println("PIN correct")
      // Change to the unlocked state
      return unlocked
    fmt.Println("Incorrect pin")
    // Stay in the locked state
    return nil
  "turn-handle": func(d *Door) {
    fmt.Println("You can't open a locked door!")
unlocked = fsm.Actions{
  "enter-pin": func(d *Door, pin string) fsm.State {
    d.code = pin
    fmt.Println("Locked the door")
    return locked
  "turn-handle": func(d *Door) {
    fmt.Println("Door open")

// Create a new FSM to represent the door
door := fsm.New(new(Door), unlocked)

door.Trigger("enter-pin", "1234") // Locked the door
door.Trigger("turn-handle")       // You can't open a locked door!
door.Trigger("enter-pin", "4321") // Incorrect pin
door.Trigger("enter-pin", "1234") // PIN correct
door.Trigger("turn-handle")       // Door open