Go言語で複数のgoroutineから1つのチャンネルに書き込こんでみる

チャンネルの練習でチャンネルを一つ作って1秒毎に書き込むgoroutineと3秒毎に書き込むgoroutineを作成し書き込まれたデータをmainで受け取って表示させてみました。

+--------+    +-------+    +--------+
|message1| -> |channel| <- |message2|
+--------+    +-------+    +--------+
                  ↓
              +------+
              |main()|
              +------+

図にするとこんな感じです。

package main

import (
  "fmt"
  "time"
)

func message1(ch chan string) {
  for i := 0; ; i++ {
    time.Sleep(1 * time.Second)
    ch <- fmt.Sprintf("message1: %d", i)
  }
}

func message2(ch chan string) {
  for i := 0; ; i++ {
    time.Sleep(3 * time.Second)
    ch <- fmt.Sprintf("message2: %d", i)
  }
}

func main() {
  ch := make(chan string)
  defer close(ch)

  go message1(ch)
  go message2(ch)

  for {
    select {
    case v := <-ch:
      fmt.Println(v)
    }
  }
}

出力結果

message1: 0
message1: 1
message1: 2
message2: 0
message1: 3
message1: 4
message2: 1
message1: 5
message1: 6
message1: 7
message2: 2
message1: 8
message1: 9
message1: 10
message2: 3
message1: 11
message1: 12
message1: 13