package main
import (
"fmt"
)
func tel(ch chan int, quit chan bool) {
for i := 1; i < 5; i++ {
ch <- i
}
// 发送一个标志符,使用close时也只是放了一个默认零值
quit <- true
}
func main() {
ch := make(chan int)
quit := make(chan bool)
go tel(ch, quit)
// 接收数据
for {
select {
case i := <-ch:
fmt.Printf("The counter is at %d\n", i)
case <-quit:
// 或 os.Exit(0),但此处不能用break直接跳出,理由不能解决死锁
goto end
}
}
end:
}
直接使用close,结合通道关闭ok测试模式
package main
import (
"fmt"
)
func tel(ch chan int) {
for i := 1; i < 5; i++ {
ch <- i
}
close(ch) // 无此句则会抛出: all goroutines are asleep - deadlock!
}
func main() {
var i int
ch := make(chan int)
go tel(ch)
for {
if i, ok = <-ch; ok {
fmt.Printf("ok is %t and the counter is at %d\n", ok, i)
}
}
}