anais @Go e impasse

Estou tentando entender o idioma Go. Tentei criar duas goroutines que encadeariam o fluxo entre elas usando dois canais:

func main() {
c1 := make(chan int)
c2 := make(chan int)

go func() {
    for i := range c1{
        println("G1 got", i)
        c2 <- i
    }
}()

go func() {
    for i := range c2 {
        println("G2 got", i)
        c1 <- i
    }
}()


c1 <- 1

time.Sleep(1000000000 * 50)
}

Como esperado, este código é impresso:

 G1 got 1
 G2 got 1
 G1 got 1
 G2 got 1
 ....

Até a função principal sai

Mas se eu enviar outro valor para um dos canais da main, ele bloqueia repentinamente:

func main() {
c1 := make(chan int)
c2 := make(chan int)

go func() {
    for i := range c1{
        println("G1 got", i)
        c2 <- i
    }
}()

go func() {
    for i := range c2 {
        println("G2 got", i)
        c1 <- i
    }
}()


c1 <- 1

time.Sleep(1000000000 * 1)

c1 <- 2

time.Sleep(1000000000 * 50)
}

Ele produz

G1 got 1
G2 got 1
G1 got 1
G2 got 1
G1 got 2

e depois bloqueia até o final principal.

O valor "2" enviado para c1 chega à primeira goroutie, que a envia para c2, mas a segunda goroutine nunca receb

(Usar canais em buffer com tamanho 1 (c1 ou c2) funciona neste exemplo)

Por que isso acontece? Quando isso acontece em código real, como posso depurá-lo?

questionAnswers(2)

yourAnswerToTheQuestion