Обязательно упоминаются соответствующие факты, то есть то, что операции канала могут блокироваться, и что программы выполняются одновременно. Ваш конкретный пример - только применение этих основ.

но работаю в Голанге. Но все же я сталкиваюсь с этой проблемой, хотя знаю решение своей проблемы. Но так и не понял, почему это происходит.

Например, если у меня есть конвейерная ситуация для входящих и исходящих каналов, как показано ниже:

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
}

Это не дает мне тупиковую ситуацию. Но если я удалю подпрограмму go внутри исходящего кода, как показано ниже:

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

Я получил ошибку взаимоблокировки. Почему так, что зацикливание на каналах с использованием диапазона без go приводит к тупику.

Ответы на вопрос(1)

Ваш ответ на вопрос