code
package main
import (
"fmt"
"time"
)
func chanTest(ch chan int) {
for { //select@H_502_5@外层需要循环 select@H_502_5@ { case@H_502_5@ value@H_502_5@,ok := <-ch: fmt.Println(value@H_502_5@,ok,time@H_502_5@.Now()) if@H_502_5@ ok == false@H_502_5@ { fmt.Println("chan已经关闭"@H_502_5@,time@H_502_5@.Now()) //select@H_502_5@要自己判断退出,如果是for@H_502_5@..range 形式,在读取完了关闭的chanel后,退出循环 return } default@H_502_5@: fmt.Println("chan 空了"@H_502_5@,time@H_502_5@.Now()) time@H_502_5@.Sleep(time@H_502_5@.Second@H_502_5@ * 5@H_502_5@) //分支的处理会阻塞整个select@H_502_5@ } } } func main() { var ch = make(chan int@H_502_5@,100@H_502_5@) go@H_502_5@ chanTest(ch) ch <- 1@H_502_5@ ch <- 2@H_502_5@ time@H_502_5@.Sleep(time@H_502_5@.Second@H_502_5@ * 2@H_502_5@) ch <- 3@H_502_5@ ch <- 4@H_502_5@ time@H_502_5@.Sleep(time@H_502_5@.Second@H_502_5@) close@H_502_5@(ch) for@H_502_5@ { time@H_502_5@.Sleep(time@H_502_5@.Second@H_502_5@) } } @H_502_5@
需要注意的是,select的 defalut会丢弃数据,chan已满的情况,入chan的数据会被丢弃