使用Go狀態機(有限狀態機,簡稱FSM(Finite-state machinet))函式庫。
範例環境:
- Go 1.19
下載module
在專案根目錄執行以下命令下載modules。
go get github.com/looplab/fsm
使用
下面為官方文件的簡單範例。
呼叫fsm.NewFSM並輸入以下參數建立一個fsm.FSM狀態機物件。
initial- 字串,狀態機的初始狀態。events-EventDescslice,用來設定狀態機的多個來源狀態(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
}
測試
執行後印出以下。
closed
open
closed
沒有留言:
張貼留言