startup-product-20220917

http://github.com/looplab/fsm

定义状态机的时候有三部分组成:状态机的初始状态,状态机的事

件(包括了多个源事件和一个目的事件),状态机的事件回调。整体来说,回

调可以分为四组8个回调,按执行顺序依次为:

1,事件开始之前

​ A,before_xxx,特定的状态之前

​ B,before_event所有状态之前

2,离开老状态

​ A,leave_xxx 离开特定状态

​ B,leave_state 离开所有状态

3,进入新状态

​ A,enter_xxx,进入特定状态

​ B,enter_state 进入所有状态

4,事件执行完毕之后

​ A,after_xxx 进入特定状态之后

​ B,after_event 进入所有状态

状态机实现的函数接口有:

1
2
3
4
5
6
7
8
9
10
func (f *FSM) AvailableTransitions() []string
func (f *FSM) Can(event string) bool
func (f *FSM) Cannot(event string) bool
func (f *FSM) Current() string
func (f *FSM) Event(event string, args ...interface{}) error
func (f *FSM) Is(state s/ring) bool
func (f *FSM) Metadata(key string) (interface{}, bool)
func (f *FSM) SetMetadata(key string, dataValue interface{})
func (f *FSM) SetState(state string)
func (f *FSM) Transition() error

例如:

1
2
3
func (f *FSM) Can(event string) bool
_, ok := f.transitions[eKey{event, f.current}]
return ok && (f.transition == nil)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//执行事件流转
func (f *FSM) Event(event string, args ...interface{}) error{
e := &Event{f, event, f.current, dst, nil, args, false, false}
err := f.beforeEventCallbacks(e)
f.transition = func() {
f.enterStateCallbacks(e)
f.afterEventCallbacks(e)
}
f.leaveStateCallbacks(e)
err = f.doTransition()
}

func (f *FSM) enterStateCallbacks(e *Event){
if fn, ok := f.callbacks[cKey{f.current, callbackEnterState}]; ok {
fn(e)
}
if fn, ok := f.callbacks[cKey{"", callbackEnterState}]; ok {
fn(e)
}
}
1
2
3
4
5
6
7
//执行
func (f *FSM) Transition() error{
return f.doTransition()
}
func (f *FSM) doTransition() error {
return f.transitionerObj.transition(f)
}