// _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)
fmt.Println("1")
go func() {
for {
fmt.Println("4")
j, more := <-jobs
if more {
fmt.Println("received job", j)
} else {
fmt.Println("received all jobs")
done <- true
return
}
}
}()
fmt.Println("2")
// This sends 3 jobs to the worker over the `jobs`
// channel, then closes it.
for j := 1; j <= 3; j++ {
fmt.Println("3", j)
jobs <- j
fmt.Println("sent job", j)
}
fmt.Println("5")
close(jobs)
fmt.Println("6")
fmt.Println("sent all jobs")
//How does control go from here to the main's go routine - line 18. Who call's it? and How?
// We await the worker using the
// [synchronization](channel-synchronization) approach
// we saw earlier.
<-done
fmt.Println("7")
}
https://play.golang.org/p/Xe_wh3YTmwk
控制如何从第 46 行转到第 18 行?
慕妹3242003
相关分类