-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path30_closing_channels.go
More file actions
47 lines (40 loc) · 1.3 KB
/
30_closing_channels.go
File metadata and controls
47 lines (40 loc) · 1.3 KB
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package gobyexample
import "fmt"
// ClosingChannelsDemo - demonstrates closing channels
func ClosingChannelsDemo() {
// 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.
// 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.
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 closed 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 approach
// we saw earlier.
<-done
}