1

我是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在第一个语句处等待无穷大。?

4

2 回答 2

6

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

于 2013-03-20T22:27:04.367 回答
6

我猜你没有正确理解幻灯片。它说“仅阻止”您理解“仅工作”。

幻灯片说的是:

  • 如果缓冲区未满,则您的发送将正常工作并且不会阻塞

  • 如果缓冲区已满,则您的发送将阻塞,直到缓冲区未满。

因此,您的示例按规定工作。

于 2013-03-21T09:26:00.950 回答