为什么这个程序产生输出

foo*_*oty 1 channel go output

我是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)
}
Run Code Online (Sandbox Code Playgroud)

它产生输出.但根据http://tour.golang.org/#64,它说:

仅在缓冲区已满时才发送到缓冲的通道块.缓冲区为空时接收阻止.

正如它所说的那样,只有当FULL为什么程序产生输出而不是c在第一个语句处等待无穷大时才发送它.?

Dan*_*iel 6

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


zk8*_*k82 6

我猜你没理解幻灯片.它说"只阻止"你理解"只工作".

幻灯片说的是:

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

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

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