想把一个channel 一变二;以便 将它们发送到 代码的两个不同独立区域中。
func main() {
tee := func(done <-chan interface{}, in <- chan interface{})( <-chan interface{}, <-chan interface {}) {
out1 := make(chan interface{})
out2 := make(chan interface{})
go func() {
defer close(out1)
defer close(out2)
for val := range orDone(done, in){
//使用out1, out2的本地化版本
var out1, out2 = out1, out2
for i := 0; i < 2; i++{
select {
case <- done :
case out1<- val:
out1 = nil
case out2<- val:
out2 = nil
}
}
}
}()
return out1, out2
}
done :=make(chan interface{})
defer close(done)
out1, out2 := tee(done, take(done, repeat(done,1,2), 4))
for val1 := range out1{
//fmt.Printf("out1:%v, out2:%v\n", val1, <-out2)
fmt.Printf("out1:%v", val1)
}
//time.Sleep(5*time.Second)
for val2 := range out2{
fmt.Printf("out1:%v", val2)
}
}
/**
缺点 必须
同时 从 out1 和 out2 中读取数据, 只读一个 会造成死锁!!!
*/