Go 发送到select内的另一个通道会造成死锁

Go 发送到select内的另一个通道会造成死锁,go,deadlock,Go,Deadlock,发送到select内的另一个通道会造成死锁。我想知道为什么会这样。是因为select语句同时持有它正在侦听的所有通道的锁吗 这是我用来测试它的代码片段: 包干管 进口 fmt 时间 func main{ c1:=makechan int c2:=makechan int 围棋{ time.Sleeptime.Second*1 c2使用makechan int创建的通道是无缓冲的。发送和接收阻塞,直到另一侧准备就绪 在您的示例中,您的主goroutine在c1上被阻塞,您必须为c1创建一个缓冲通道

发送到select内的另一个通道会造成死锁。我想知道为什么会这样。是因为select语句同时持有它正在侦听的所有通道的锁吗

这是我用来测试它的代码片段:

包干管 进口 fmt 时间 func main{ c1:=makechan int c2:=makechan int 围棋{ time.Sleeptime.Second*1 c2使用makechan int创建的通道是无缓冲的。发送和接收阻塞,直到另一侧准备就绪


在您的示例中,您的主goroutine在c1上被阻塞,您必须为c1创建一个缓冲通道。因为当您发送到c1时,即

case i := <-c2:
    c1 <- i
}

初始化通道时在代码中输入

c1:= make(chan int)    
您正在创建一个无缓冲的频道,selectcase中的后续代码将被阻止

c1 <- i
或者您可以创建另一个goroutine来发送值。这样,新的goroutine将被阻止,for循环将能够从c1检索值

for {
    select {
    case i := <-c1:
        fmt.Println(i)
    case i := <-c2:
        go func() {
            c1 <- i
        }()
    }
}
c1 := make(chan int, 1)
for {
    select {
    case i := <-c1:
        fmt.Println(i)
    case i := <-c2:
        go func() {
            c1 <- i
        }()
    }
}