什么是channel

答:channel是在两个 goroutine 间通信的桥梁

如何定义channel

  1. 方式一:
  2. Chan := make(chan bool)
  3. 方式二:
  4. Chan := make(chan int, 100)

问题:为什么 Go语言对通道要限制长度而不提供无限长度的通道?

channel是在两个 goroutine 间通信的桥梁。使用 goroutine 的代码必然有一方提供数据,一方消费数据 。通道如果不限制长度,在生产速度大于消费速度时,内存将不断膨胀直到应用崩溃。

  1. 发送 ch在左边)
  2. ch <- 10
  3. 接收 ch在右边)
  4. x := <- ch
  5. func man(){
  6. // 1 创建有缓冲管道
  7. //有缓冲生产消费模型:异步通信
  8. //无缓冲生产消费模型:同步通信
  9. ch := make(chan int, 3)
  10. // 2 给管道存储数据,先入先出
  11. ch <- 10
  12. ch <- 10
  13. ch <- 10
  14. // 3 管道的类型
  15. 管道是引用类型
  16. // 4 管道的容量和长度
  17. // 5 管道阻塞有两种情况
  18. 1.通道被填满时,写入,则发生管道阻塞
  19. 2.通道为空时,读取,则发生管道阻塞
  20. //7遍历管道的两种方式
  21. // 方法1> for range //需要关闭管道
  22. var ch make(chan int, 10)
  23. for i:=1; i<=10; i++{
  24. ch <- i
  25. }
  26. close(ch) // 遍历管道前,需要关闭管道,不然会形成死锁
  27. for val := range ch{
  28. fmt.Println(val)
  29. }
  30. // 方法2> for
  31. var ch2 make(chan int, 10)
  32. for i:=1; i<=10; i++{
  33. ch2 <- i
  34. }
  35. for j := 0; j < 10; j++{
  36. fmt.Println(<-ch)
  37. }
  38. }

需求1:
定义两个方法,一个方法给管道写数据,一个管道读数, 要求同步进行

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. )
  6. var wg sync.WaitGroup
  7. func Write(ch chan int) {
  8. for i := 0; i <= 10; i++ {
  9. ch <- i
  10. }
  11. close(ch)
  12. wg.Done()
  13. }
  14. func Read(ch chan int) {
  15. for v := range ch {
  16. fmt.Println(v)
  17. }
  18. wg.Done()
  19. }
  20. func main() {
  21. var ch = make(chan int, 10)
  22. wg.Add(1)
  23. go Write(ch)
  24. wg.Add(1)
  25. go Read(ch)
  26. wg.Wait()
  27. fmt.Println("end")
  28. }
  29. 输出:
  30. 0
  31. 1
  32. 2
  33. 3
  34. 4
  35. 5
  36. 6
  37. 7
  38. 8
  39. 9
  40. 10
  41. end