github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/18channeluse/stream/main.go (about) 1 package main 2 3 func asStream(done <-chan struct{}, values ...interface{}) <-chan interface{} { 4 s := make(chan interface{}) 5 go func() { 6 defer close(s) 7 8 for _, v := range values { 9 select { 10 case <-done: 11 return 12 case s <- v: 13 } 14 } 15 16 }() 17 return s 18 } 19 20 func skipN(done <-chan struct{}, valueStream <-chan interface{}, num int) <-chan interface{} { 21 takeStream := make(chan interface{}) 22 go func() { 23 defer close(takeStream) 24 for i := 0; i < num; i++ { 25 select { 26 case <-done: 27 return 28 case <-valueStream: 29 } 30 } 31 for { 32 select { 33 case <-done: 34 return 35 case takeStream <- <-valueStream: 36 } 37 } 38 }() 39 return takeStream 40 } 41 42 func skipFn(done <-chan struct{}, valueStream <-chan interface{}, fn func(interface{}) bool) <-chan interface{} { 43 takeStream := make(chan interface{}) 44 go func() { 45 defer close(takeStream) 46 for { 47 select { 48 case <-done: 49 return 50 case v := <-valueStream: 51 if !fn(v) { 52 takeStream <- v 53 } 54 } 55 } 56 }() 57 58 return takeStream 59 }