使用Go狀態機(有限狀態機,簡稱FSM(Finite-state machinet))函式庫。
範例環境:
- Go 1.19
下載module
在專案根目錄執行以下命令下載modules。
go get github.com/looplab/fsm
使用
下面為官方文件的簡單範例。
呼叫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
}
測試
執行後印出以下。
closed
open
closed
沒有留言:
張貼留言