2012-08-13 107 views

回答

110

緩衝區大小是可以發送到沒有發送阻止的通道的元素的數量。默認情況下,一個通道的緩衝區大小爲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 
+17

好的答案。 Effective Go有一個很好的章節,標題爲「併發」,闡述了渠道。強烈建議:http://golang.org/doc/effective_go.html – Levi 2012-08-14 02:26:46

+0

Im搞砸了這個和make(chan int,1)允許3個值在阻塞之前傳入我的頻道(用log.Printlns進行測試),並且默認是在阻塞之前讓2進入。任何想法爲什麼: – Mauricio 2017-06-13 22:35:35

+0

@Mauricio這聽起來很奇怪。我剛剛在本地使用Go 1.8.3進行了測試,並且還使用了https://golang.org上的「Try Go」功能,並且在這兩種情況下,它的行爲仍然與我的答案中記錄的相同。 – 2017-06-14 23:30:18

2

下面的代碼說明無緩衝信道的阻塞:

// 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) 

您可以用代碼here玩。