網頁

2023/7/7

Golang 狀態機函式庫 looplab/fsm使用

使用Go狀態機(有限狀態機,簡稱FSM(Finite-state machinet))函式庫。


範例環境:

  • Go 1.19


下載module

在專案根目錄執行以下命令下載modules。



使用

下面為官方文件的簡單範例。

呼叫fsm.NewFSM並輸入以下參數建立一個fsm.FSM狀態機物件。

  • initial - 字串,狀態機的初始狀態。
  • events - EventDesc slice,用來設定狀態機的多個來源狀態(Src)和目的狀態(Dst)轉移(transition)事件。fsm.EventDesc欄位如下:
    • Name - 狀態轉移事件名稱,呼叫fsm.FSM.Event輸入名稱可觸發狀態移轉事件。
    • Src - 來源狀態。
    • Dst - 目地狀態。
  • callbacks - fsm.Callbacks,即map[string]Callback,為各種事件或狀態轉移前後的回呼函式。

呼叫fsm.FSM.Current可取得目前狀態。

呼叫fsm.FSM.Event,輸入fsm.EventDesc的名稱來觸發狀態移轉事件。

main.go

package main

import (
    "context"
    "fmt"

    "github.com/looplab/fsm"
)

func main() {
    fsm := fsm.NewFSM(
        "closed",
        fsm.Events{
            {Name: "open", Src: []string{"closed"}, Dst: "open"},
            {Name: "close", Src: []string{"open"}, Dst: "closed"},
        },
        fsm.Callbacks{},
    )

    fmt.Println(fsm.Current()) // closed

    err := fsm.Event(context.Background(), "open") // trigger "open" event
    if err != nil {
        panic(err)
    }

    fmt.Println(fsm.Current()) // open

    err = fsm.Event(context.Background(), "close") // trigger "close" event
    if err != nil {
        panic(err)
    }

    fmt.Println(fsm.Current()) // closed
}

github



測試

執行後印出以下。

closed
open
closed

沒有留言:

張貼留言