@ajlhimik

Каналы в golang, а как ту че та?

package main
import "fmt"
 
func main() {
     
    intCh := make(chan int, 2) 
    go factorial(5, intCh)
    fmt.Println(<-intCh)
    fmt.Println("The End")
}
 
func factorial(n int, ch chan<- int){
     
    result := 1
    for i := 1; i <= n; i++{
        result *= i
    }
    ch <- result
}

вот код
функция factorial() принимает n и канал ch, вопрос такой- ch это :
1. небуферизированный канал созданный обьявлением функций факториал который копирует данные intCh // мало вероятно, откуда в intCh будут потом результаты функций factorial()
2. так как intCh и ch разные (первый двухнапрвленный а второй однонаправоенный ), последний точно не копирует первого, может он(канал ch) чтото вроде поинтера(для каналов :D ) для intCh
вообшем как мне понять почему fmt.Println(<-intCh) выдает 120
откуда в канале intCh данные вообше оказались?
  • Вопрос задан
  • 537 просмотров
Пригласить эксперта
Ответы на вопрос 2
Sly_tom_cat
@Sly_tom_cat
.
Канал в коде только один: intCh, при вызове factorial канал передается по ссылке (он только так и передается) и внутри factorial этот единственный канал называется ch и впридачу на него наложено ограничение что этот канал можно использовать только для вывода в него (ограничение наложено в декларации параметра функции).

Никакой магии - канал объявили, передали, прочитали из него.
Ответ написан
Комментировать
@RidgeA
Канал передается по ссылке. То, что канал в функции однонаправленный - ни как не меняет и не копирует исходный канал, просто внутри функции его нельзя использовать иначе (канал для записи нельзя прочитать, в канал для чтения нельзя записать)

https://play.golang.com/p/v00VjMZHqGu
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы