go 基础chan

管道 chan

func main()  {
	numchan := make(chan int)
	go func() {
		for i:=0;i<20;i++{
			numchan <- i
			fmt.Println("写入数据:",i)
		}
		close(numchan)
	}()
	//管道通过range遍力,只返回一个值
	//for range是不知道写入完成,所以会一直等待
	//在写入端,将管道关闭,for range遍历关闭的管道时会退出
	for v:= range numchan{
		fmt.Println("读取数据:", v)
	}
	numchan2 := make(chan int,10)
	go func() {
		for i:=0;i<20;i++{
			numchan2 <-i
			fmt.Println("写入数据",i)
		}
		close(numchan2)
	}()
	//判断管道是否关闭
	for{
		v,ok := <-numchan2
		if !ok{
			fmt.Println("管道已经关闭,准备退出")
			break
		} else {
			fmt.Println("读取数据",v)
		}
	}

}
//、单向通道
func main()  {
	numchan := make(chan int,10)
	go produce(numchan)
	go consumer(numchan)
	time.Sleep(2*time.Second)
}
func produce(out chan <- int)  {
	//生产者,往管道里面写数据
	for i:=0;i<30;i++{
		out <- i
		fmt.Println("往管道里面写数据",i)
	}
}
func consumer(in <- chan int)  {
	for v:= range in{
		fmt.Println("读取数据",v)
	}
}
posted on 2022-05-17 11:34  每天进步一点点点点点  阅读(28)  评论(0编辑  收藏  举报