go 管道关闭和循环使用
package main import ( "fmt" "sync" "time" ) /* channel提供了一种通信机制 定向 消息队列 */ var wgt sync.WaitGroup //消费者 func cousumer(queue chan string){ defer wgt.Done() //第一种遍历管道 //for { // data :=<- queue // fmt.Println(data) // time.Sleep(time.Second) //} //第二种管道关闭处理 for{ data,ok:=<-queue if !ok { break } fmt.Println(data) time.Sleep(time.Second) } //遍历管道 //for data :=range queue{ // fmt.Println(data) // time.Sleep(time.Second*1) //} //data :=<-queue //fmt.Println(data) } func main(){ //静态语言 需要申明类型 //定义一个channel 发一个,就需要消费一个 var msg chan string //初始化这个channel 初始化有两种方式: 1.无缓冲空间的管道 2.有缓存空间的管道 //msg=make(chan int)//没有缓冲空间的管道 fatal error: all goroutines are asleep - deadlock! msg=make(chan string,1)//有缓存空间的 如果缓冲空间满了也会报 fatal error: all goroutines are asleep - deadlock! // go 语言中使用make初始化有三种 1.slice 2.map 3.channel msg <- "s"//把字符串s放入 channel中 //msg<-"ww" //管道看起来好像是有空间的数组 // data :=<- msg //将箭头右边的值放到左边 //通道数据读取完之后,就不能在读取了 //加协程 waitGroup的目的是为了控制流程,使主进程和子进程在子进程全部完成之后,结束主进程 wgt.Add(1) go cousumer(msg) // msg <- "测试" close(msg) //关闭管道 // 关闭channel 1.已经关闭的channel不能再发送数据了 2.关闭的channel能取数据吗? // 已经关闭的channel 能够继续读数据 直到数据取完为止 wgt.Wait() //fmt.Println(data) }