Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save taka011239/b0d8fb6bc2a87842a18e to your computer and use it in GitHub Desktop.
Save taka011239/b0d8fb6bc2a87842a18e to your computer and use it in GitHub Desktop.
buffer channelとunbuffer channelの挙動差異

buffered channelとunbuffered channelの挙動の違い

channelにbufferがあるかないかで、channelを使った同期の挙動が異なる。

詳しくは、公式のThe Go Memory Modelを参照。

Rule

以下のルールに従う。 bufferの有無で、送信と受信の優先順位が変わるので注意。

channel type Rule
buffered channel channelへの送信は、channelからの受信より先に起こる
unbuffered channel channelからの受信は、channelへの送信より先に起こる

Code

  • unBufferedCh.goは、送信より先に受信が起こるので必ずhello, worldが出力される
  • bufferdCh_Bug.goは、受信より先に送信が起こるのでhello, worldが出力されるとは限らない
  • bufferdCh.goのように、受信と送信を入れ替えれば必ずhello, worldが出力される
package main
import "fmt"
var c = make(chan int, 1)
var a string
func f() {
a = "hello, world"
c <- 0
}
func main() {
go f()
<-c
fmt.Println(a)
}
package main
import "fmt"
var c = make(chan int, 1)
var a string
func f() {
a = "hello, world"
<-c
}
func main() {
go f()
c <- 0
fmt.Println(a)
}
package main
import "fmt"
var c = make(chan int)
var a string
func f() {
a = "hello, world"
<-c
}
func main() {
go f()
c <- 0
fmt.Println(a)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment