--- /dev/null
+
+package main
+
+import (
+ "fmt"
+ "time"
+ "math/rand"
+)
+
+func boring(msg string) <- chan string {
+ c := make(chan string)
+ go func() {
+ for i := 0; ; i++ {
+ r := rand.Intn(3e3)
+ c <- fmt.Sprintf("%s %d (%d)", msg, i, r)
+ time.Sleep(time.Duration(r) * time.Millisecond)
+ }
+ }()
+ return c
+}
+
+func main1() {
+ c := boring("boring!")
+ for i := 0; i< 5; i++ {
+ fmt.Printf("You say: %q\n", <-c)
+ }
+ fmt.Println("You're boring. I'm leaving.")
+}
+
+func main2() {
+ joe := boring("Joe")
+ ann := boring("Ann")
+ for i := 0; i < 5; i++ {
+ fmt.Println(<-joe)
+ fmt.Println(<-ann)
+ }
+ fmt.Println("You're both boring. I'm leaving.")
+}
+
+func fanIn(input1, input2 <- chan string) <-chan string {
+ c := make(chan string)
+ go func() { for { c <- <-input1 } }()
+ go func() { for { c <- <-input2 } }()
+ return c
+}
+
+func main3() {
+ c := fanIn(boring("Joe"), boring("Ann"))
+ for i := 0; i < 10; i++ {
+ fmt.Printf("%q\n", <-c)
+ }
+ fmt.Println("You're boring. I'm leaving.")
+}
+
+func main() {
+ rand.Seed(time.Now().Unix())
+
+ main3()
+}