Я учусь 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
Я удивлен, увидев, что:
- В Фибоначчи весело c, для итерации 1, канал длина остается 0 после ввода значения в канале?
- В основной итерации c l oop 1 длина канала показывает 0, даже если в канале заполняется полная серия Фибоначчи?
Я узнал, что len (chan) дает количество элементов в очереди (непрочитанных) в буфере канала. Но ooutput ограничивает первую итерацию моего кода. Может ли кто-нибудь помочь мне понять это?