// +build ignore,OMIT package main import ( "fmt" ) func main() { in, out := make(chan int), make(chan int) go buffer(in, out) for i := 0; i < 10; i++ { in <- i } close(in) for i := range out { fmt.Println(i) } } // buffer provides an unbounded buffer between in and out. buffer // exits when in is closed and all items in the buffer have been sent // to out, at which point it closes out. func buffer(in <-chan int, out chan<- int) { var buf []int for in != nil || len(buf) > 0 { var i int var c chan<- int if len(buf) > 0 { i = buf[0] c = out // enable send case } select { case n, ok := <-in: if ok { buf = append(buf, n) } else { in = nil // disable receive case } case c <- i: buf = buf[1:] } } close(out) }