Concurrency In Go 纠错 01

作者:guoxj
浏览:342

    第四章127页,中关于“一些便利的生成器”处代码。

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
                // valueStream is send-only channel,get the element in the channel first
                // case takeStream <- valueStream:
                case takeStream <- <- valueStream:
                }
            }
        }()
        return takeStream
    }

    done := make(chan interface{})
    defer close(done)

    for num := range take(done, repeat(done, 1), 10) {
        fmt.Printf("%d ", num)
    }
}

 




登录后回复

共有0条评论