Edited at

go初心者がgoroutineとChannelを使ってみる


goroutineとは

要はgoでサポートされているマルチスレッドの機構みたいなもの?

http://go-tour-jp.appspot.com/#63 より


goroutine (ゴルーチン)は、Goのランタイムに管理される軽量なスレッドです。

go f(x, y, z)

と書けば、 f は新しいgoroutine上で実行されます。



Channelとは

これを使えばプロデューサーコンシューマパターン的なものが書けそう

http://go-tour-jp.appspot.com/#64 より


チャネル( Channel )は、チャネルオペレータの <- を用いて値の送受信ができる直通ルートの型です。

ch <- v // v をチャネル ch へ送る。

v := <-ch // ch から受信し、

// 変数を v へ割り当てる。

(データは、矢印の方向に流れます。)

マップとスライスのように、チャネルは使う前に以下のように生成する必要があります:

ch := make(chan int)

デフォルトでは、片方が準備できるまで送受信はブロックされます。 これは、明確なロックや条件変数がなくても、goroutineの同期を許します。



書いてみた

package main

import (
"fmt"
"time"
)

func putChannel(c chan int, count int) {
for i := 0; i < count; i++ {
c <- i
fmt.Printf("add %d...\n", i)
time.Sleep(100 * time.Millisecond)
}
close(c)
}

func main() {
c := make(chan int, 5)
go putChannel(c, 10)
time.Sleep(600 * time.Millisecond)
for i := range c {
fmt.Println(i)
}

}


結果

channelのバッファサイズは5なので5までの追加が先に行われ

その後はchannelからデータを取り出す->入れるが繰り返される

add 0...

add 1...
add 2...
add 3...
add 4...
0
1
2
3
4
add 5...
5
add 6...
6
add 7...
7
add 8...
8
add 9...
9