Break out of select loop?

Issue

I’m trying to use a select in a loop to receive either a message or a timeout signal. If the timeout signal is received, the loop should abort:

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)
        }
    }
}

However, it doesn’t seem to be stopping:

$ 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
[...]

Why? Am I using time.After wrong?

Solution

The Go spec says:

A “break” statement terminates execution of the innermost “for”,
“switch”, or “select” statement within the same function.

In your example you’re just breaking out of the select statement. If you replace break with a return statement you will see that it’s working.

Answered By – Pat

Answer Checked By – Pedro (GoLangFix Volunteer)

Leave a Reply

Your email address will not be published.