开发中,我们经常会遇到这种情况,服务模块有多种状态,它们有一定的顺序,先后执行,逐步切换。这时,fsm这个库可以帮助我们更好的管理多个状态。

fsm库,它主要基于两个FSM实现,增加了golang版本的实现:

简单举例

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/looplab/fsm"
  5. )
  6. func enterState(e *fsm.Event) {
  7. fmt.Printf("event: %s, from:%s to %s\n", e.Event, e.Src, e.Dst)
  8. }
  9. func main() {
  10. f := fsm.NewFSM(
  11. "sleeping",
  12. fsm.Events{
  13. {Name: "eat", Src: []string{"sleeping"}, Dst: "eating"},
  14. {Name: "work", Src: []string{"eating"}, Dst: "working"},
  15. {Name: "sleep", Src: []string{"working"}, Dst: "sleeping"},
  16. },
  17. fsm.Callbacks{
  18. "enter_state": func(e *fsm.Event) { enterState(e) },
  19. },
  20. )
  21. err := f.Event("eat")
  22. if err != nil {
  23. fmt.Println(err)
  24. }
  25. err = f.Event("work")
  26. if err != nil {
  27. fmt.Println(err)
  28. }
  29. err = f.Event("sleep")
  30. if err != nil {
  31. fmt.Println(err)
  32. }
  33. }

执行,控制台输出如下:

  1. $ go run test.go
  2. event: eat, from:sleeping to eating
  3. event: work, from:eating to working
  4. event: sleep, from:working to sleeping

结构体举例

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/looplab/fsm"
  5. )
  6. type Door struct {
  7. To string
  8. FSM *fsm.FSM
  9. }
  10. func NewDoor(to string) *Door {
  11. d := &Door{
  12. To: to,
  13. }
  14. d.FSM = fsm.NewFSM(
  15. "closed",
  16. fsm.Events{
  17. {Name: "open", Src: []string{"closed"}, Dst: "open"},
  18. {Name: "close", Src: []string{"open"}, Dst: "closed"},
  19. },
  20. fsm.Callbacks{
  21. "enter_state": func(e *fsm.Event) { d.enterState(e) },
  22. },
  23. )
  24. return d
  25. }
  26. func (d Door) enterState(e fsm.Event) {
  27. fmt.Printf("The door to %s, event: %s, from:%s to %s\n", d.To, e.Event, e.Src, e.Dst)
  28. }
  29. func main() {
  30. door := NewDoor("zhang san")
  31. err := door.FSM.Event("open")
  32. if err != nil {
  33. fmt.Println(err)
  34. }
  35. err = door.FSM.Event("close")
  36. if err != nil {
  37. fmt.Println(err)
  38. }
  39. }

执行,控制台输出如下:

  1. $ go run test.go
  2. The door to zhang san, event: open, from:closed to open
  3. The door to zhang san, event: close, from:open to closed

总结

fsm 是一个非常简单,好用的状态机管理库。如果你各种状态切换的需求,不妨试试看,相信一定会喜欢上的!

参考资料