我有一种状态机。所以我有几个状态:
const (
state1 = iota
state2
state3
exit
)另外,我还有一个chan
stateMachine := make(chan int)我把第一个状态:
stateMachine <- state1然后,我像这样进入无限循环:
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)
}
}
}但它不起作用。
发布于 2020-04-21 03:17:02
通道是一种同步机制。仅当有另一个goroutine等待从同一通道读取/写入时,才能成功写入或读取到无缓冲通道。由于您有一个未缓冲的通道,并且尝试使用通道作为状态存储,因此您的第一次写入会阻塞,因为没有其他goroutine读取它。
尝试容量为1的通道:
stateMachine := make(chan int,1)这将使写入工作,只要通道有存储。
发布于 2020-04-21 04:53:44
我不知道为什么,但这是有效的:
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://stackoverflow.com/questions/61329901
复制相似问题