【发布时间】:2014-01-07 05:49:48
【问题描述】:
我有一些问题...关于缓冲频道
第一季度。
那为什么 NonBuffered 从不输出 TRUE 值呢?
这是否意味着无缓冲通道总是关闭? 那么为什么无缓冲通道仍然会产生正确的斐波那契计算结果呢?
第二季度。
为什么 NonBuffered 输出会像下面这样在中间被截断?
0 1 1 2 NB value: 0
NB ok: false
3
应该是和goroutine有关的东西,但是为什么会这样呢?
这很难理解,因为如果我缓冲这个通道,我会得到真正的价值,但如果没有缓冲的通道,我只会得到假......
请查看以下链接。
http://play.golang.org/p/O2Th61DfEY
package main
import "fmt"
func main() {
ch := make(chan int)
go NB(5, ch)
for i := range ch {
fmt.Printf("%d ", i)
}
/*
0 1 1 2 NON_Buffered value: 0
NON_Buffered ok: false
3
*/
fmt.Println()
value, ok := <-ch
fmt.Println("MAIN = NB value:", value)
fmt.Println("MAIN = NB ok:", ok)
}
func NB(n int, ch chan int) {
x, y := 0, 1
for i := 0; i < n; i++ {
ch <- x
x, y = y, x+y
}
close(ch)
value, ok := <-ch
fmt.Println("NB value:", value)
fmt.Println("NB ok:", ok)
}
非常感谢!
【问题讨论】:
标签: concurrency go buffer channel