Golang – 什么是通道缓冲区大小?

我试图创build一个asynchronous通道,我一直在寻找http://golang.org/ref/spec#Making_slices_maps_and_channels 。

c := make(chan int, 10) // channel with a buffer size of 10 

这是什么意思,缓冲区大小是10? 什么具体的缓冲区大小代表/限制?

缓冲区大小是可以在没有发送阻塞的情况下发送到频道的元素的数量。 默认情况下,一个通道的缓冲区大小为0(你用make(chan int)得到这个)。 这意味着每一个发送都将被阻塞,直到另一个goroutine从该频道收到。 缓冲区大小为1的通道可以保持1个元素,直到发送块,所以你会得到

 c := make(chan int, 1) c <- 1 // doesn't block c <- 2 // blocks until another goroutine receives from the channel 

以下代码说明了无缓冲通道的阻塞情况:

 // to see the diff, change 0 to 1 c := make(chan struct{}, 0) go func() { time.Sleep(2 * time.Second) <-c }() start := time.Now() c <- struct{}{} // block, if channel size is 0 elapsed := time.Since(start) fmt.Printf("Elapsed: %v\n", elapsed) 

你可以在这里玩这个代码。