channelにbufferがあるかないかで、channelを使った同期の挙動が異なる。
詳しくは、公式のThe Go Memory Modelを参照。
以下のルールに従う。 bufferの有無で、送信と受信の優先順位が変わるので注意。
channel type | Rule |
---|---|
buffered channel | channelへの送信は、channelからの受信より先に起こる |
unbuffered channel | channelからの受信は、channelへの送信より先に起こる |
unBufferedCh.go
は、送信より先に受信が起こるので必ずhello, world
が出力されるbufferdCh_Bug.go
は、受信より先に送信が起こるのでhello, world
が出力されるとは限らないbufferdCh.go
のように、受信と送信を入れ替えれば必ずhello, world
が出力される