Dog*_*Dog 6 concurrency select go goroutine
我正在尝试select在循环中使用a 来接收消息或超时信号.如果收到超时信号,则循环应该中止:
package main
import ("fmt"; "time")
func main() {
done := time.After(1*time.Millisecond)
numbers := make(chan int)
go func() {for n:=0;; {numbers <- n; n++}}()
for {
select {
case <-done:
break
case num := <- numbers:
fmt.Println(num)
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,它似乎没有停止:
$ go run a.go
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[...]
3824
3825
[...]
Run Code Online (Sandbox Code Playgroud)
为什么?我用time.After错了吗?
One*_*One 19
这种情况的“Go”方式是使用标签并在标签上打断,例如:
L:
for {
select {
case <-done:
break L
case num := <- numbers:
fmt.Println(num)
}
}
Run Code Online (Sandbox Code Playgroud)
参考:
使用一些控制变量来跳过循环怎么样?有时打破标签会很难或不太容易理解。
package main
import ("fmt"; "time")
func main() {
done := time.After(1*time.Millisecond)
numbers := make(chan int)
go func() {for n:=0;; {numbers <- n; n++}}()
completed := false
for !completed {
select {
case <-done:
completed = true
// no break needed here
case num := <- numbers:
fmt.Println(num)
}
}
}
Run Code Online (Sandbox Code Playgroud)
在您的示例代码中,return似乎适合Pat说,但为了将来参考,您可以使用标签:
package main
import (
"fmt"
"time"
)
func main() {
done := time.After(1 * time.Millisecond)
numbers := make(chan int)
// Send to channel
go func() {
for n := 0; ; {
numbers <- n
n++
}
}()
readChannel:
for {
select {
case <-done:
break readChannel
case num := <-numbers:
fmt.Println(num)
}
}
// Additional logic...
fmt.Println("Howdy")
}
Run Code Online (Sandbox Code Playgroud)
小智 7
通过使用匿名函数,我有以下解决方案。
func() {
for {
select {
case <-time.After(5 * time.Second):
if token := c.Connect(); token.Wait() && token.Error() != nil {
fmt.Println("connect err:", token.Error())
} else {
fmt.Println("breaking")
return
}
}
}
}()
Run Code Online (Sandbox Code Playgroud)