首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Go中的状态机

Go中的状态机
EN

Stack Overflow用户
提问于 2020-04-21 02:54:37
回答 2查看 154关注 0票数 0

我有一种状态机。所以我有几个状态:

代码语言:javascript
运行
复制
const (
    state1 = iota
    state2
    state3
    exit
)

另外,我还有一个chan

代码语言:javascript
运行
复制
stateMachine := make(chan int)

我把第一个状态:

代码语言:javascript
运行
复制
stateMachine <- state1

然后,我像这样进入无限循环:

代码语言:javascript
运行
复制
for {
   select {
   case state := <- stateMachine:
      switch state {
      case state1: 
         fmt.Println("state1")
         stateMachine <- state2
      case state2: 
         fmt.Println("state2")
         stateMachine <- state3
      case state3: 
         fmt.Println("state3")
         stateMachine <- exit
      case exit:
         fmt.Println("Exit")
         os.Exit(0)
      }
   }
}

但它不起作用。

https://play.golang.org/p/s5uYJy-fMKe

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-21 03:17:02

通道是一种同步机制。仅当有另一个goroutine等待从同一通道读取/写入时,才能成功写入或读取到无缓冲通道。由于您有一个未缓冲的通道,并且尝试使用通道作为状态存储,因此您的第一次写入会阻塞,因为没有其他goroutine读取它。

尝试容量为1的通道:

代码语言:javascript
运行
复制
stateMachine := make(chan int,1)

这将使写入工作,只要通道有存储。

票数 2
EN

Stack Overflow用户

发布于 2020-04-21 04:53:44

我不知道为什么,但这是有效的:

代码语言:javascript
运行
复制
package main

import (
    "fmt"
    "os"
)

const (
    state1 = iota
    state2
    state3
    exit
)

func main() {
    stateMachine := make(chan int)
    go func() { stateMachine <- state1 }()
    for {
        select {
        case state := <-stateMachine:
            switch state {
            case state1:
                fmt.Println("state1")
                go func() { stateMachine <- state2 }()
            case state2:
                fmt.Println("state2")
                go func() { stateMachine <- state3 }()
            case state3:
                fmt.Println("state3")
                go func() { stateMachine <- exit }()
            case exit:
                fmt.Println("Exit")
                os.Exit(0)
            }
        }
    }
}

https://play.golang.org/p/JH-w6SDCh-Z

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61329901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档