go version go1.11 windows/amd64
本文为解读 参考链接1 中的 菊花链 一节 的示例程序,此程序和 参考链接2 中代码有些类似:前者有范围,后者是无限循环。清楚了 参考链接1 的逻辑,就能理解 参考链接2 的代码。
测试代码——测试语句使用蓝色字:
package main import ( "fmt" ) // 6.菊花链 // 数据从一端流入,从另一端流出,看上去好像一个链表 // 过滤器 func xrange2() chan int { // 从2开始自增的整数生成器 var ch chan int = make(chan int) fmt.Println("xrange2 - ch @ ", ch) go func() { // 开出一个goroutine for i := 2; ; i++ { // 直到信道索要数据,才把i添加进信道 fmt.Println("xrange2: i = ", i) ch <- i } } () return ch } func filter(in chan int, number int) chan int { // 输出一个整数队列,筛出是number倍数的,不是number的倍数的放入输出队列 // in: 输入队列 out := make(chan int) fmt.Println("\nfilter - in @ ", in) fmt.Println("filter - number: ", number) go func() { for { i := <- in // 从输入中取一个 fmt.Println("filter - in @ ", in, ", i = ", i) if i % number != 0 { fmt.Println("放入输出信道 in @ ", in, ", number = ", number) out <- i // 放入输出信道 } } } () return out } func main() { // 6.菊花链