package main func merge1(ch1, ch2 <-chan int) <-chan int { ch := make(chan int, 1) go func() { for v := range ch1 { ch <- v } for v := range ch2 { ch <- v } close(ch) }() return ch } func merge2(ch1, ch2 <-chan int) <-chan int { ch := make(chan int, 1) go func() { for { select { case v := <-ch1: ch <- v case v := <-ch2: ch <- v } } close(ch) }() return ch } func merge3(ch1, ch2 <-chan int) <-chan int { ch := make(chan int, 1) ch1Closed := false ch2Closed := false go func() { for { select { case v, open := <-ch1: if !open { ch1Closed = true break } ch <- v case v, open := <-ch2: if !open { ch2Closed = true break } ch <- v } if ch1Closed && ch2Closed { close(ch) return } } }() return ch } func merge4(ch1, ch2 <-chan int) <-chan int { ch := make(chan int, 1) go func() { for ch1 != nil || ch2 != nil { select { case v, open := <-ch1: if !open { ch1 = nil break } ch <- v case v, open := <-ch2: if !open { ch2 = nil break } ch <- v } } close(ch) }() return ch }