为什么不Stopped打印出来,main而是返回?
package main
import (
"fmt"
"time"
)
func main() {
tick := time.Tick(100 * time.Millisecond)
boom := time.After(500 * time.Millisecond)
var stop chan int = make(chan int)
for {
select {
case <- stop:
fmt.Println("Stopped!")
case <-tick:
fmt.Println("tick.")
case <-boom:
fmt.Println("BOOM!")
stop <- 0
default:
fmt.Println(" .")
time.Sleep(50 * time.Millisecond)
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
.
.
tick.
.
.
tick.
.
.
tick.
.
.
tick.
.
.
tick.
BOOM!
Run Code Online (Sandbox Code Playgroud)
预计:
.
.
tick.
.
.
tick.
.
.
tick.
.
.
tick.
.
.
tick.
BOOM!
Stopped!
Run Code Online (Sandbox Code Playgroud)
在围棋编程语言规范说,大约发送到通道的情况如下:
通信阻塞,直到发送可以继续。如果接收器准备好,则可以继续在无缓冲通道上发送。如果缓冲区中有空间,则可以继续在缓冲通道上发送。
因此,当您的代码到达stop <- 0它时,它会阻塞等待另一个 goroutine 从通道读取,而这永远不会发生(您case <- stop:在同一个 goroutine 中,因此未处于活动状态)。
有几种方法可以解决这个问题:
stop := make(chan int, 1))。close(stop))。注意:由于您的应用程序的编写方式,这些选项实际上都不会停止它,因为您的 for 循环永远不会退出(添加break或return退出)。
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |