github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2013/advconc/buffer/buffer.go (about) 1 // +build OMIT 2 3 package main 4 5 import ( 6 "fmt" 7 ) 8 9 func main() { 10 in, out := make(chan int), make(chan int) 11 go buffer(in, out) 12 for i := 0; i < 10; i++ { 13 in <- i 14 } 15 close(in) 16 for i := range out { 17 fmt.Println(i) 18 } 19 } 20 21 // buffer provides an unbounded buffer between in and out. buffer 22 // exits when in is closed and all items in the buffer have been sent 23 // to out, at which point it closes out. 24 func buffer(in <-chan int, out chan<- int) { 25 var buf []int 26 for in != nil || len(buf) > 0 { 27 var i int 28 var c chan<- int 29 if len(buf) > 0 { 30 i = buf[0] 31 c = out // enable send case 32 } 33 select { 34 case n, ok := <-in: 35 if ok { 36 buf = append(buf, n) 37 } else { 38 in = nil // disable receive case 39 } 40 case c <- i: 41 buf = buf[1:] 42 } 43 } 44 close(out) 45 }