select {case c <- x: // if I can send to c // update my variables x, y = y, x+ycase <-quit: // If I can receive from quit then I'm supposed to exit fmt.Println("quit") return}
没有
default案例意味着“如果我无法发送给c并且我不能从quit中读取,请阻塞直到可以。”
然后在您的主要过程中,您将剥离另一个函数以读取
c结果以打印结果
for i:=0; i<10; i++ { fmt.Println(<-c) // read in from c}quit <- 0 // send to quit to kill the main process.
这里的关键是要记住通道阻塞,并且您正在使用两个未缓冲的通道。利用
go分拆的第二功能让您从消费
c那么
fibonacci将继续。
Goroutines是所谓的“绿色线程”。使用关键字启动函数调用
go会将其分解为一个新进程,该进程独立于执行主线运行。本质上,
main()和
gofunc() ...正在同时运行!这很重要,因为我们在此代码中使用了生产者/消费者模式。
fibonacci产生值并将其发送到
c,从main派生的匿名goroutine会消耗
c并处理它们的值(在这种情况下,“处理它们”仅意味着打印到屏幕上)。我们不能简单地产生所有值然后消费它们,因为
c会阻塞。此外,
fibonacci它将永远产生更多的值(或无论如何直到整数溢出),因此即使您拥有一个具有无限长缓冲区的魔术通道,也永远不会到达使用者。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)