1 回答

TA贡献1830条经验 获得超9个赞
考虑 time.After 做了什么(引用go docs):
After 等待持续时间过去,然后在返回的通道上发送当前时间。
所以boom := time.After(500 * time.Millisecond)将返回一个通道并在 500 毫秒后向该通道发送一条消息。现在让我们考虑您的代码:
case <-boom:
fmt.Println("BOOM!")
c, ok := <-boom
fmt.Println(c)
fmt.Println(ok)
当在景气通道上接收到某些内容时,您的代码会打印“景气”,然后在景气通道上等待其他内容。但是,只有一件事会发送到繁荣通道,因此该语句c, ok := <-boom将永远不会完成(并且您的应用程序将永远不会终止)。如果您将繁荣从 a 更改为time.Aftera,time.Tick那么您可能会看到更像您期望的东西(应用程序仍将永远运行)。
原始代码有点不同:
case <-boom:
fmt.Println("BOOM!")
return
它接收消息,打印繁荣然后返回(结束程序)。如果您希望您的代码到达它输出“finished”的位置,那么您需要类似于下面的代码。请注意,标签loop是必需的,因为 break:
终止执行最里面的“for”、“switch”或“select”
所以没有标签 break 将退出选择,但 for 循环将继续。
package main
import (
"fmt"
"time"
)
func main() {
tick := time.Tick(100 * time.Millisecond)
boom := time.After(500 * time.Millisecond)
loop:
for {
select {
case <-tick:
fmt.Println("tick.")
case <-boom:
fmt.Println("BOOM!")
break loop
default:
fmt.Println(" .")
time.Sleep(50 * time.Millisecond)
}
}
fmt.Println("Finished")
}
- 1 回答
- 0 关注
- 124 浏览
添加回答
举报