channel常常结合go程使用,作为通信消息队列
var testChan chan int fmt.Println(testChan) // nil 未初始化,没地址 testChan = make(chan int,0) fmt.Println(testChan) //0xc420072180 完成了初始化 //1.往channel写会阻塞,直到消费者把它读出来 testChan<-1 //2.往缓冲为N的channel写,写满N个值后阻塞 testChan = make(chan int,10) for i:=0;i<12;i++{ fmt.Println(i) //0,1,2,3,4,5,6,7,8,9 } //3.往已经关闭的channel写数据会panic close(testChan) testChan<-1 //panic: send on closed channel //4.从一个已经关闭了的非缓冲channel读出来的值是默认值 close(testChan) i:=<-testChan //i=0 i,ok=<-testChan //i=0,ok=false //5.从一个已经关闭了的缓冲channel能读出来的关闭前遗留的值 testChan = make(chan int, 4) fmt.Println(testChan) for i := 0; i < 4; i++ { testChan <- i } close(testChan) for i := 0; i < 6; i++ { i := <-testChan fmt.Println(i) //0,1,2,3,0,0 }