下面的演示程序 chaining.go 再次演示了启动大量的协程是多么的容易。它发生在 mian 函数的 for 循环中。在循环之后,向 rightmost 通道中插入 0 ,在不到 1.5 s 的时间执行了 100000 个协程,并将结果 100000 打印。
    这个程序还演示了如何通过命令行的参数定义一个协程的数量,并通过 flag.Int 解析,例如: chaining -n=7000 (编译后通过命令行执行),可以生成 7000 个协程。

    示例 14.17 - chaining.go:

    1. package main
    2. import (
    3. "flag"
    4. "fmt"
    5. )
    6. var ngoroutine = flag.Int("n", 100000, "how many goroutines")
    7. func f(left, right chan int) { left <- 1+<-right }
    8. func main() {
    9. flag.Parse()
    10. leftmost := make(chan int)
    11. var left, right chan int = nil, leftmost
    12. for i := 0; i < *ngoroutine; i++ {
    13. left, right = right, make(chan int)
    14. go f(left, right)
    15. }
    16. right <- 0
    17. // start the chaining 开始链接
    18. x := <-leftmost // wait for completion 等待完成
    19. fmt.Println(x)
    20. // 结果: 100000 , 大约 1,5s (我实际测试只用了不到200ms)
    21. }