我是谷歌新来的GO
。在缓冲通道中,这是一个程序:
package main
import "fmt"
import "time"
func main() {
c := make(chan int, 2)
c <- 1
fmt.Println(<-c)
time.Sleep(1000 * time.Millisecond)
c <- 2
fmt.Println(<-c)
}
它产生输出。但根据http://tour.golang.org/#64它说:
仅当缓冲区完整时才发送到缓冲的通道块。 缓冲区为空时接收阻塞。
正如它所说的那样,只有在 FULL 时才发送,为什么程序会产生输出而不是等待c
的无穷大在第一个语句处满。 ?
答案 0 :(得分:6)
您的频道的缓冲区大小为2。你把一个int放进去然后拉出一个int。然后你睡觉并重复这个过程。在尝试插入第三个int而不拉出任何整数之前,通道不会阻塞。前两个整数将被缓冲。
答案 1 :(得分:6)
我猜你没理解幻灯片。 它说“仅阻止”你理解为“只工作”。
幻灯片说的是:
如果缓冲区未满,那么您的发送将正常运行且无法阻止
如果缓冲区已满,那么您的发送将被阻止,直到缓冲区未满。
所以你的例子按指定的方式工作。