为什么在 select 中对无缓冲的 channel 写入数据会阻塞住并且另一个 channel 也读不到数据

package main

import (
    "fmt"
    "time"
)

func main() {
    ch1 := make(chan int)
    ch2 := make(chan int)

    go func() {
        for {
            select {
            case v := <-ch1:
                fmt.Println("ch1: ", v)
                ch2 <- v            // 到这里阻塞了
                fmt.Println("send to ch2")
            case v := <-ch2:
                fmt.Println("ch2: ", v)
            }
        }
    }()

    ch1 <- 1
    for {
        time.Sleep(1 * time.Second)
    }
}

程序输出

ch1:  1
最佳答案

selece进入了case1阻塞了,case2是没法执行,只有等select-case运行完执行下一次select时才能去case2.

3年前 评论
讨论数量: 3

selece进入了case1阻塞了,case2是没法执行,只有等select-case运行完执行下一次select时才能去case2.

3年前 评论

不知道什么说,有点那啥。无缓冲通道,必须读和写入都准备才可以。在go开启一个协程中,你的这个写法相当于: ch2 <- 2然后就没然后了,能不阻塞吗。

3年前 评论

谢谢大神们, 再一次认识了无缓冲通道

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!