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が出力される