go rutina para rango sobre canales

He estado trabajando en Golang durante mucho tiempo. Pero todavía estoy enfrentando este problema, aunque sé la solución a mi problema. Pero nunca descubrí por qué está sucediendo.

Por ejemplo, si tengo una situación de canalización para canales entrantes y salientes como a continuación:

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
}

No me da una situación de punto muerto. Pero si elimino la rutina go dentro del código saliente como se muestra a continuación:

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

Recibí un error de punto muerto. ¿Por qué es así que recorrer los canales usando el rango sin ir a la rutina da un punto muerto?

Respuestas a la pregunta(2)

Su respuesta a la pregunta