记录了书上的错误…
先直接上代码吧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
package main import ( "fmt" ) func main() { repeat := func( done <-chan interface{}, values ...interface{}, ) <-chan interface{} { valueStream := make(chan interface{}) go func() { defer close(valueStream) for { for _, v := range values { select { case <-done: return case valueStream <- v: } } } }() return valueStream } take := func( done <-chan interface{}, valueStream <-chan interface{}, num int, ) <-chan interface{} { takeStream := make(chan interface{}) go func() { defer close(takeStream) for i := 0; i < num; i++ { select { case <-done: return case takeStream <- <- valueStream: } } }() return takeStream } done := make(chan interface{}) defer close(done) for num := range take(done, repeat(done, 1, 2, 3), 10) { fmt.Printf("%v ", num) } fmt.Println() } |
这里注意 case takeStream <- <- valueStream: (line 41)这一行,书中原文是一个箭头,但是实际上要两个。
原因是我们需要将 valueStream内容取出来 然后 塞进takeStream里面去。
但是因为类型是 interface,然后原文只有一个箭头: case takeStream <- valueStream:
意义就变成了将 valueStream直接塞到了takeStream里面去了。
【Go语言并发之道】第四章 repeat生成器