Go入门学习实例——有限状态机

编程入门 行业动态 更新时间:2024-10-13 12:21:06

Go入门学习<a href=https://www.elefans.com/category/jswz/34/1771375.html style=实例——有限状态机"/>

Go入门学习实例——有限状态机

安装好IDEA和GO插件,创建项目GoDemo

键入代码:

FSM.go

package srcimport ("fmt""sync"
)type FSMState string //状态
type FSMEvent string //事件
type FSMHandler func() FSMState //处理方法,并返回新的状态//有限状态机
type FSM struct {mu sync.Mutex  //排它锁state FSMState  //当前状态handlers map[FSMState]map[FSMEvent]FSMHandler  //处理地图集,每一个状态都可以出发有限个事件,执行有限个处理
}//获取当前状态
func (f *FSM) getState() FSMState {return f.state
}//设置当前状态
func (f *FSM) setState(newState FSMState) {f.state = newState
}//某状态添加事件处理方式
func (f *FSM) AddHandler(state FSMState, event FSMEvent, handler FSMHandler) *FSM {if _, ok := f.handlers[state]; !ok {f.handlers[state] = make(map[FSMEvent]FSMHandler)}if _, ok := f.handlers[state][event]; ok {fmt.Print("[警告] 状态(%s)事件(%s)已定义过", state, event)}f.handlers[state][event] = handlerreturn f
}//事件处理
func (f *FSM) Call(event FSMEvent) FSMState {f.mu.Lock()defer f.mu.Unlock()events := f.handlers[f.getState()]if events == nil {return f.getState()}if fn,ok := events[event]; ok {oldState := f.getState()f.setState(fn())newState := f.getState()fmt.Println("状态从 [", oldState,"] 变成 [", newState, "]")}return f.getState()
}//实例化FSM
func NewFSM(initState FSMState) *FSM {return &FSM{state: initState,handlers: make(map[FSMState]map[FSMEvent]FSMHandler),}
}

FSM_demo.go

package mainimport ("fmt". "./src"
)var (//PowerOff = FSMState("关闭")FirstGear = FSMState("1档")SecondGear = FSMState("2档")ThirdGear = FSMState("3档")//PowerOffEvent = FSMEvent("按下关闭按钮")FirstGearEvent = FSMEvent("按下1档按钮")SecondGearEvent = FSMEvent("按下2档按钮")ThirdGearEvent = FSMEvent("按下3档按钮")//PowerOffHandler = FSMHandler(func() FSMState {fmt.Println("电风扇已关闭")return PowerOff})FirstGearHandler = FSMHandler(func() FSMState {fmt.Println("电风扇开启1档,微风徐来!")return FirstGear})SecondGearHandler = FSMHandler(func() FSMState {fmt.Println("电风扇开启2档,凉飕飕!")return SecondGear})ThirdGearHandler = FSMHandler(func() FSMState {fmt.Println("电风扇开启3档,发型被吹乱了!")return ThirdGear})
)//电风扇
type ElectricFan struct {*FSM
}//实例化电风扇
func NewElectricFan(initState FSMState) *ElectricFan {return &ElectricFan{FSM: NewFSM(initState),}
}//入口函数
func main() {//电风扇实例efan := NewElectricFan(PowerOff)//关闭状态efan.AddHandler(PowerOff, PowerOffEvent, PowerOffHandler)efan.AddHandler(PowerOff, FirstGearEvent, FirstGearHandler)efan.AddHandler(PowerOff, SecondGearEvent, SecondGearHandler)efan.AddHandler(PowerOff, ThirdGearEvent, ThirdGearHandler)//1档状态efan.AddHandler(FirstGear, PowerOffEvent, PowerOffHandler)efan.AddHandler(FirstGear, FirstGearEvent, FirstGearHandler)efan.AddHandler(FirstGear, SecondGearEvent, SecondGearHandler)efan.AddHandler(FirstGear, ThirdGearEvent, ThirdGearHandler)//2档状态efan.AddHandler(SecondGear, PowerOffEvent, PowerOffHandler)efan.AddHandler(SecondGear, FirstGearEvent, FirstGearHandler)efan.AddHandler(SecondGear, SecondGearEvent, SecondGearHandler)efan.AddHandler(SecondGear, ThirdGearEvent, ThirdGearHandler)//3档状态efan.AddHandler(ThirdGear, PowerOffEvent, PowerOffHandler)efan.AddHandler(ThirdGear, FirstGearEvent, FirstGearHandler)efan.AddHandler(ThirdGear, SecondGearEvent, SecondGearHandler)efan.AddHandler(ThirdGear, ThirdGearEvent, ThirdGearHandler)//开始测试状态变化efan.Call(ThirdGearEvent);efan.Call(FirstGearEvent);efan.Call(PowerOffEvent);efan.Call(SecondGearEvent);efan.Call(PowerOffEvent);
}

 

运行结果:

D:\AI\IntelliJ-IDEA\bin\runnerw.exe D:\AI\Go\bin\go.exe run E:/各种语言/Go/projects/GoDemo/FSM_demo.go
电风扇开启3档,发型被吹乱了!
状态从 [ 关闭 ] 变成 [ 3档 ]
电风扇开启1档,微风徐来!
状态从 [ 3档 ] 变成 [ 1档 ]
电风扇已关闭
状态从 [ 1档 ] 变成 [ 关闭 ]
电风扇开启2档,凉飕飕!
状态从 [ 关闭 ] 变成 [ 2档 ]
电风扇已关闭
状态从 [ 2档 ] 变成 [ 关闭 ]

 

更多推荐

Go入门学习实例——有限状态机

本文发布于:2024-02-08 21:12:13,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1675099.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:实例   入门   状态机

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!