2013-03-20 93 views
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滿了第一個語句。 ?

回答

6

您的頻道的緩衝區大小爲2。你把一個int放在一個int中。然後你睡覺並重復這個過程。通道不會阻塞,直到您嘗試插入第三個int而不提取任何ints爲止。前兩個整數將被緩衝。

6

我想你沒有正確理解幻燈片。 它說「只阻止」你明白「工作只」。

什麼幻燈片說的是:

  • 如果緩衝器未滿,那麼你的發送將正常工作,也不會封鎖

  • 如果緩衝區已滿,那麼你發送將阻塞,直到緩衝區未滿。

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