Неправильная длина канала после ввода / приема с канала - PullRequest
0 голосов
/ 18 апреля 2020

Я учусь Go из Тура Go. Я изменил код, указанный на странице Range and Close , чтобы увидеть длину канала до и после того, как значение помещено в канал в funonacci fun c. Также проверяется длина после того, как значение прочитано в основной шутке c 'sl oop.

package main

import "fmt"

func fibonacci(n int, c chan int) {
    x, y := 0, 1
    for i := 0; i <= n; i++ {
        fmt.Println("fib - len before: ", len(c))
        c <- x
        fmt.Println("fib - len after : ", len(c))
        x, y = y, x+y
    }
    close(c)
}

func main() {
    c := make(chan int, 3)
    go fibonacci(cap(c), c)
    for i := range c {
        fmt.Println("main - len now: ", len(c))
        fmt.Println("value recieved: ", i)
    }
}

Вывод:

fib - len before:  0
fib - len after :  0 ////// not expecting this
fib - len before:  0 ////// not expecting this
fib - len after :  1
fib - len before:  1
fib - len after :  2
fib - len before:  2
fib - len after :  3
main - len now:  0 ////// not expecting this
value recieved:  0
main - len now:  2
value recieved:  1
main - len now:  1
value recieved:  1
main - len now:  0
value recieved:  2

Я удивлен, увидев, что:

  1. В Фибоначчи весело c, для итерации 1, канал длина остается 0 после ввода значения в канале?
  2. В основной итерации c l oop 1 длина канала показывает 0, даже если в канале заполняется полная серия Фибоначчи?

Я узнал, что len (chan) дает количество элементов в очереди (непрочитанных) в буфере канала. Но ooutput ограничивает первую итерацию моего кода. Может ли кто-нибудь помочь мне понять это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...