开启协程
go PrintChan(ch)
此时发生了阻塞 所以不需要用到协程中的time.sleep()
从通道中接收数据 直到有数据从通道处读取了数据才会解除阻塞
rec := <-ch
接收数据等待发送数据时受到了阻塞 当写入完成时 主协程接收到了数据 就解除了阻塞
打印从通道接收的数据 读取数据后如果没有其他协程将其他数据写入通道 那么读取数据过程也会一直受到阻塞
fmt.Println(rec)
并发调用的场景
//关闭通道
//close(channel_name) 对于一个已经关闭的通道再次关闭会报错
//可以在接收的时候判断一下通道是否关闭
//value,ok:=<-channel_name 此时从通道中读取到的数据返回的第二个值 就表示通道是否关闭了 关闭返回false,未关闭返回true
//通道的容量和长度
// c := make(chan int, 3)
// fmt.Println("初始化后")
// fmt.Println("cap(容量)=", cap(c))
// fmt.Println("len(长度)=", len(c))
// c <- 1
// c <- 2
// fmt.Println("传入两个参数后:")
// fmt.Println("cap(容量)=", cap(c))
// fmt.Println("len(长度)=", len(c))
// <-c
// fmt.Println("读取一个数据后:")
// fmt.Println("cap(容量)=", cap(c))
// fmt.Println("len(长度)=", len(c))
当容量为0时,通道中不能存放数据
发送数据时必须要求立马有人去接收 否则会报错
当容量为1时,说明通道中只能缓存一个数据
若通道中已有一个数据,此时再往里发送数据就会造成阻塞 通过这一点可以用通道作锁
当容量大于1,通道中可以存放多个数据,可以用于多个协程之间的通信管道共享资源