Golang:无缓冲和单向channel

我就是我 2022-05-22 03:47 344阅读 0赞

简介

初学golang很容易混淆无缓冲的chan和只有一个元素的chan,认为这两个是一回事,其实是完全不同的,make(chan int) 是同步的,只能同时读写,没有读写会一直阻塞;make(chan int,1)是异步的,第一个入队的不会阻塞

  1. c1:=make(chan int) 无缓冲
  2. c2:=make(chan int,1) 有缓冲

code

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. )
  6. var wt sync.WaitGroup
  7. func OutChan(noBufChan <-chan int) {
  8. //chan关闭后for退出循环,否则会死循环
  9. for v := range noBufChan {
  10. fmt.Println(v)
  11. }
  12. wt.Done()
  13. }
  14. func InChan(noBufChan chan<- int) {
  15. for i := 0; i < 5; i++ {
  16. noBufChan <- i
  17. }
  18. //v := <-noBufChan //invalid operation: <-noBufChan (receive from send-only type chan<- int)
  19. close(noBufChan)
  20. wt.Done()
  21. }
  22. func main() {
  23. wt.Add(2)
  24. //无缓冲的chan,同步方式,有读才能写入
  25. var noBufChan = make(chan int)
  26. go InChan(noBufChan)
  27. go OutChan(noBufChan)
  28. wt.Wait()
  29. fmt.Println("goroute全部退出")
  30. }

发表评论

表情:
评论列表 (有 0 条评论,344人围观)

还没有评论,来说两句吧...

相关阅读