go rotina para o alcance sobre canais

Estive trabalhando em Golang há muito tempo. Mas ainda estou enfrentando esse problema, embora conheça a solução para o meu problema. Mas nunca descobri por que isso está acontecend

Por exemplo, se eu tiver uma situação de pipeline para canais de entrada e saída como abaixo:

package main

import (
    "fmt"
)

func main() {
    for n := range sq(sq(gen(3, 4))) {
        fmt.Println(n)
    }
    fmt.Println("Process completed")
}

func gen(nums ...int) <-chan int {
    out := make(chan int)
    go func() {
        for _, n := range nums {
            out <- n
        }
        close(out)
    }()
    return out
}

func sq(in <-chan int) <-chan int {
    out := make(chan int)
    go func() {
        for n := range in {
            out <- n * n
        }
        close(out)
    }()
    return out
}

Não me dá uma situação de impasse. Mas se eu remover a rotina go dentro do código de saída como abaixo:

func sq(in <-chan int) <-chan int {
    out := make(chan int)
    for n := range in {
        out <- n * n
    }
    close(out)
    return out
}

Eu recebi um erro de deadlock. Por que é assim que fazer um loop nos canais usando a faixa sem rotina de ir dá um impasse.

questionAnswers(2)

yourAnswerToTheQuestion