51 lines
1.3 KiB
Go
51 lines
1.3 KiB
Go
// _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)
|
|
}
|
|
close(jobs)
|
|
fmt.Println("sent all jobs")
|
|
|
|
// We await the worker using the
|
|
// [synchronization](channel-synchronization) approach
|
|
// we saw earlier.
|
|
<-done
|
|
}
|