建议阅读:14.2协程间的信道

问题:为什么代码1会报死锁的错误,而代码2不会报错?

代码1:

package main

import (
    "fmt"
)

func main() {
    ch := make(chan int)
    ch <- 1
    fmt.Println(<-ch) // 1

}

代码2:

package main

import (
    "fmt"
)

func main() {
    ch := make(chan int, 1)
    ch <- 1
    fmt.Println(<-ch) // 1

}

解答:

因为代码1的channel没有buffer,而代码2的channel设置了buffer为1。
没有buffer的channel只能通过另一个goroutine去读,否则就阻塞了。

可以理解成,代码1执行到 ch <- 1 时只有main一个“协程”(其实是线程),并没有其他协程进行接收 ch 

相关文章:

  • 2021-09-03
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-16
  • 2022-02-08
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-11-18
  • 2021-11-27
  • 2021-09-13
  • 2022-01-13
  • 2021-10-20
相关资源
相似解决方案