チャンネルの練習でチャンネルを一つ作って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