什么是channel
答:channel是在两个 goroutine 间通信的桥梁
如何定义channel
方式一:Chan := make(chan bool)方式二:Chan := make(chan int, 100)
问题:为什么 Go语言对通道要限制长度而不提供无限长度的通道?
channel是在两个 goroutine 间通信的桥梁。使用 goroutine 的代码必然有一方提供数据,一方消费数据 。通道如果不限制长度,在生产速度大于消费速度时,内存将不断膨胀直到应用崩溃。
发送 (ch在左边)ch <- 10接收 (ch在右边)x := <- chfunc man(){// 1 创建有缓冲管道//有缓冲生产消费模型:异步通信//无缓冲生产消费模型:同步通信ch := make(chan int, 3)// 2 给管道存储数据,先入先出ch <- 10ch <- 10ch <- 10// 3 管道的类型管道是引用类型// 4 管道的容量和长度// 5 管道阻塞有两种情况1.通道被填满时,写入,则发生管道阻塞2.通道为空时,读取,则发生管道阻塞//7遍历管道的两种方式// 方法1> for range //需要关闭管道var ch make(chan int, 10)for i:=1; i<=10; i++{ch <- i}close(ch) // 遍历管道前,需要关闭管道,不然会形成死锁for val := range ch{fmt.Println(val)}// 方法2> forvar ch2 make(chan int, 10)for i:=1; i<=10; i++{ch2 <- i}for j := 0; j < 10; j++{fmt.Println(<-ch)}}
需求1:
定义两个方法,一个方法给管道写数据,一个管道读数, 要求同步进行
package mainimport ("fmt""sync")var wg sync.WaitGroupfunc Write(ch chan int) {for i := 0; i <= 10; i++ {ch <- i}close(ch)wg.Done()}func Read(ch chan int) {for v := range ch {fmt.Println(v)}wg.Done()}func main() {var ch = make(chan int, 10)wg.Add(1)go Write(ch)wg.Add(1)go Read(ch)wg.Wait()fmt.Println("end")}输出:012345678910end
