channelnobuffer以及buffer的区别

题目来源:畅天游

答案:

(1)无缓冲的通道保证进行发送和接收的 goroutine 会在同一时间进行数据交换;有缓冲的通道没有这种保证。

(2)声明无缓冲 channel 的方式是不指定缓冲大小的:

  1. package main
  2. import (
  3. "sync"
  4. "time"
  5. )
  6. func main() {
  7. c := make(chan string)
  8. var wg sync.WaitGroup
  9. wg.Add(2)
  10. go func() {
  11. defer wg.Done()
  12. c <- `foo`
  13. }()
  14. go func() {
  15. defer wg.Done()
  16. time.Sleep(time.Second * 1)
  17. println(`Message: `+ <-c)
  18. }()
  19. wg.Wait()
  20. }

解释:第一个协程会在发送消息foo时阻塞,原因是接收者还没有就绪。

如果缓冲大小设置为 0 或者不设置,channel 为无缓冲类型,通信成功的前提是发送者和接收者都处于就绪状态。

(3)为通道增加一个有限大小的存储空间形成带缓冲通道:

  1. package main
  2. import "fmt"
  3. func main() {
  4. // 创建一个3个元素缓冲大小的整型通道
  5. ch := make(chan int, 3)
  6. // 查看当前通道的大小
  7. fmt.Println(len(ch))
  8. // 发送3个整型元素到通道
  9. ch <- 1
  10. ch <- 2
  11. ch <- 3
  12. // 查看当前通道的大小
  13. fmt.Println(len(ch))
  14. }

解释:输出的结果为 0 3