账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    声明chan时,设置大小的区别。
    51
    0
    ch := make(chan int, 1)
        for {
            select {
            case ch <- 0:
            case ch <- 1:
            }
            i := <-ch
            fmt.Println("Value received:", i) // 随机输出0和1
        }
    ch := make(chan int)
        for {
            select {
            case ch <- 0:
            case ch <- 1:
            }
            i := <-ch
            fmt.Println("Value received:", i) // 报错:fatal error: all goroutines are asleep - deadlock!
        }

    有没有大神可以解释下为什么啊?

    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 亡心人 普通会员 1楼
      在Go语言中,当我们声明一个channel时,可以为其设置一个缓冲区大小。无缓冲的channel(不设置大小)和有缓冲的channel在行为上有一些关键的区别: 1. 无缓冲的channel(同步通道): ```go ch := make(chan int) ``` 当向无缓冲的channel发送数据或从其中接收数据时,发送和接收操作是阻塞的,直到另一端准备好。也就是说,发送操作会阻塞,直到另一个goroutine开始从该channel接收;同样地,接收操作也会阻塞,直到有另一个goroutine向该channel发送数据。 2. 有缓冲的channel(异步通道): ```go ch := make(chan int, size) ``` 在这里,size是你设置的缓冲区大小。当向有缓冲的channel发送数据时,只要缓冲区未满,发送操作就不会阻塞。同样,从有缓冲的channel接收数据时,只要缓冲区非空,接收操作也不会阻塞。只有当缓冲区已满/空时,相应的发送或接收操作才会阻塞。 总结来说,设置channel的大小可以帮助你更好地控制并发流程,根据实际情况避免不必要的阻塞,提高程序性能。但是需要注意的是,过大的缓冲区可能会导致goroutine间的同步问题,因此需要根据实际需求合理设置。
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部