Диапазон для l oop по небуферизованному каналу - PullRequest
0 голосов
/ 04 мая 2020

Я новичок в golang и прохожу через Гастур . У меня есть следующий код, который работает отлично, как и должно.

package main

import (
    "fmt"
)

func fibonacci(n int, c chan int) {
    x, y := 0, 1
    for i := 0; i < n; i++ {
        c <- x
        x, y = y, x+y
    }
    close(c)
}

func main() {
    c := make(chan int, 5)
//  c := make(chan int)     //doesn't work, why ?
    go fibonacci(cap(c), c)
    for i := range c {
        fmt.Println(i)
    }
}

Но когда я использую небуферизованный канал вместо буферизованного, я не получаю никакого вывода, почему это так?

Ответы [ 2 ]

1 голос
/ 04 мая 2020

cap(c) будет нулевым, если канал не буферизован. См. измененную программу

1 голос
/ 04 мая 2020

Когда вы передаете cap (c) через функцию fibonacci, через какое значение передается? на буферизованном канале n == 5, на небуферизованном канале n == 0

и ваш для l oop

for i := 0; i < 0; i++ {

На самом деле, это действительно плохой способ справиться с ситуацией. , Требуется, чтобы количество каналов было равно количеству итераций.

Используя канал таким образом, я бы не рекомендовал думать о канале как о возможности одновременной работы, чего не следует делать в этом сценарии!

Если вы пройдете число отдельно от количества подпрограмм, тогда небуферизованный канал будет работать как положено:

https://play.golang.org/p/G1b2vjTUCsV

...