为什么这个程序产生输出

时间:2013-03-20 22:20:54

标签: go output channel

我是谷歌新来的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的无穷大在第一个语句处满。 ?

2 个答案:

答案 0 :(得分:6)

您的频道的缓冲区大小为2。你把一个int放进去然后拉出一个int。然后你睡觉并重复这个过程。在尝试插入第三个int而不拉出任何整数之前,通道不会阻塞。前两个整数将被缓冲。

答案 1 :(得分:6)

我猜你没理解幻灯片。 它说“仅阻止”你理解为“只工作”。

幻灯片说的是:

  • 如果缓冲区未满,那么您的发送将正常运行且无法阻止

  • 如果缓冲区已满,那么您的发送将被阻止,直到缓冲区未满。

所以你的例子按指定的方式工作。