1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-23 20:02:22 +00:00
This commit is contained in:
kumakichi 2020-05-07 17:14:09 +08:00
parent d6b085a92c
commit e2b91e789b

View File

@ -536,37 +536,37 @@ func main() {
我们通过`select``default`分支可以很容易实现一个Goroutine的退出控制:
```go
func worker(cannel chan bool) {
func worker(cancel chan bool) {
for {
select {
default:
fmt.Println("hello")
// 正常工作
case <-cannel:
case <-cancel:
// 退出
}
}
}
func main() {
cannel := make(chan bool)
go worker(cannel)
cancel := make(chan bool)
go worker(cancel)
time.Sleep(time.Second)
cannel <- true
cancel <- true
}
```
但是管道的发送操作和接收操作是一一对应的如果要停止多个Goroutine那么可能需要创建同样数量的管道这个代价太大了。其实我们可以通过`close`关闭一个管道来实现广播的效果,所有从关闭管道接收的操作均会收到一个零值和一个可选的失败标志。
```go
func worker(cannel chan bool) {
func worker(cancel chan bool) {
for {
select {
default:
fmt.Println("hello")
// 正常工作
case <-cannel:
case <-cancel:
// 退出
}
}