package main
import "fmt"
func fibonacci(c, quit chan int) {
x, y := 1, 1
for {
select { //走到这里会阻塞等待
case c <- x: //有数据传入通道 才会来 不是吗??
x, y = y, x+y
case <-quit:
fmt.Println("quit")
return
}
}
}
func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<-c) //阻塞 直到有数据可以取才执行
}
quit <- 0
}()
fibonacci(c, quit)
}
通篇没有看到 向通道里传递值呀···· 怎么会走到 select 下的 case c <- x: 中去呢??
1
zhujinliang 2017-11-29 12:17:07 +08:00 via iPhone
c <- x 就是向 c 里传递值,那个 select 选择的是:要么 c 可写入,要么 quit 可读出。
|
2
hdczsf 2017-11-29 12:18:09 +08:00
package main
import "fmt" func fibonacci(c, quit chan int) { x, y := 1, 1 for { select { //走到这里会阻塞等待 case c <- x: //① 这里把 x 传入通道 c,传入之后,②处立刻可以输出 x, y = y, x+y case <-quit: fmt.Println("quit") return } } } func main() { c := make(chan int) quit := make(chan int) go func() { for i := 0; i < 10; i++ { fmt.Println(<-c) //② 阻塞 直到有数据可以取才执行 ①处把 x 传入通道 c,这里立刻可以输出 } quit <- 0 }() fibonacci(c, quit) } |
3
araraloren 2017-11-29 13:25:33 +08:00
c,quit 都是 chan 的话,我一个没学过 go 的人都知道这操作明显是不同的
|
4
HarrisonZ 2017-11-29 14:07:05 +08:00
case c <- x 这是向 c 传值,只要 c 是可写的就会走到这里
|
5
dushandz OP @hdczsf = =b 哦 好像明白了 那 select 的执行时随机的 保不齐走到 <- quit 发现 为 false ?
|
6
dushandz OP @hdczsf 不好意思 没说明白 我又整理了下思路 是不是这样
② 阻塞 阻塞了 新开的 goroutine fibonacci 里的 select 阻塞了 原来的 goroutine 然后发现两个 goroutine 都准备好了 随机执行了 case 语句 case <-quit: 执行返回 false ? 因为通道里没有数据? case c <- x: 返回了 true |