_Closing_ a channel indicates that no more values will be sent on it. This can be useful to communicate completion to the channel's receivers. | ||
package main |
||
import "fmt" |
||
In this example we'll use a `jobs` channel to communicate work to be done from the `main()` goroutine to a worker goroutine. When we have no more jobs for the worker we'll `close` the `jobs` channel. | func main() { |
|
jobs := make(chan int, 5) |
||
done := make(chan bool) |
||
Here's the worker goroutine. It repeatedly receives from `jobs` with `j, more := <-jobs`. In this special 2-value form of receive, the `more` value will be `false` if `jobs` has been `close`d and all values in the channel have already been received. We use this to notify on `done` when we've worked all our jobs. | go func() { |
|
for { |
||
j, more := <-jobs |
||
if more { |
||
fmt.Println("received job", j) |
||
} else { |
||
fmt.Println("received all jobs") |
||
done <- true |
||
return |
||
} |
||
} |
||
}() |
||
This sends 3 jobs to the worker over the `jobs` channel, then closes it. | for j := 1; j <= 3; j++ { |
|
jobs <- j |
||
fmt.Println("sent job", j) |
sent job 1 sent job 2 sent job 3 |
|
} |
||
close(jobs) |
||
fmt.Println("sent all jobs") |
received job 1 sent all jobs |
|
We await the worker using the [synchronization](channel-synchronization) approach we saw earlier. | <-done |
received job 1 received job 2 received job 3 received all jobs |
} |