围棋

2015-09-26 69 views
4

这里的“走出去”的关键字是“围棋之旅” Range and Close代码示例:围棋

package main 

import (
    "fmt" 
) 

func fibonacci(n int, c chan int) { 
    x, y := 0, 1 
    for i := 0; i < n; i++ { 
     c <- x 
     x, y = y, x+y 
    } 
    close(c) 
} 

func main() { 
    c := make(chan int, 10) 
    go fibonacci(cap(c), c) 
    for i := range c { 
     fmt.Println(i) 
    } 
} 

在从底部时省略了go关键字第五行,结果却事与愿违更改。这是否意味着主要的参与者在缓冲的渠道中发送了价值信息,然后将它们带出?

回答

2

你可以认为它是这样的:

随着go关键字,则fibonacci功能添加数字到所述通道和所述for i := range c回路一旦打印每个数出,因为它被添加到信道。

没有go关键字,则fibonacci函数被调用时,增加了所有号码给信道,然后返回,并然后for打印关闭channel的数字。

看到这样的一个好方法是把睡眠(playground link):

package main 

import (
    "fmt" 
    "time" 
) 

func fibonacci(n int, c chan int) { 
    x, y := 0, 1 
    for i := 0; i < n; i++ { 
     time.Sleep(time.Second) // ADDED THIS SLEEP 
     c <- x 
     x, y = y, x+y 
    } 
    close(c) 
} 

func main() { 
    c := make(chan int, 10) 
    go fibonacci(cap(c), c) // TOGGLE BETWEEN THIS 
    // fibonacci(cap(c), c) // AND THIS 
    for i := range c { 
     fmt.Println(i) 
    } 
} 
+1

好,更技术性的解释可能提的是'go'关键字居然在一个单独的线程启动的方法:) – favoretti

+2

它可以在单独的线程中启动一个方法。或者它可以在同一个线程中完成,但是在主要goroutine和新衍生的斐波那契goroutine之间切换。这是一个小问题,但只是想确保它不会与实际的OS级别线程混淆。 –