Channels(チャンネル)
Channels are a typed conduit through which you can send and receive values with the channel operator, <-.
code:sample.go
ch <- v // Send v to channel ch.
v := <-ch // Receive from ch, and assign value to v.
//(The data flows in the direction of the arrow.)
//Like maps and slices, channels must be created before use:
ch := make(chan int)
//By default, sends and receives block until the other side is ready. This allows goroutines to synchronize without explicit locks or condition variables.
//The example code sums the numbers in a slice, distributing the work between two goroutines. Once both goroutines have completed their computation, it calculates the final result.
送信と受信は、お互いが完了するまでブロックする(バッファがない場合)
これによりゴルーチンは明示的なロックや条件変数なしにシンクロナイズできる
Buffered Channel
Bufferなしチャンネルは1個送信するとそれが受け取られるまでは送信できないので、送信側はブロックする
Range and Close
ChannelはCloseすることができる
送信側 (ch <- vする側)のゴルーチンだけがチャネルをcloseするべきである
チャネルはファイルとは違って必ずcloseしなければならないと言うものではない
for文におけるrangeの挙動
closeされるまで無限ループする
Select
2つ以上のチャネルへのアクションのどちらかを待ち受けることができる
渡すことも受け取ることもある
Default Select
Select文に入ったときどのチャネルもreadyでなかった時に行われる処理を書くことができる
Exercise: Equivalent Binary Trees
sync.Mutex
Javaのsynchronizedに似ていると思うけどあまりわかっていない
Exercise: Web Crawler