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です。1つのintを入れてから、1つのintを引き出します。次に、あなたは眠り、プロセスを繰り返します。intを引き出さずに、3番目のintを挿入しようとするまで、チャネルはブロックされません。最初の2つのintはバッファリングされます。

于 2013-03-20T22:27:04.367 に答える
6

スライドを正しく理解していなかったと思います。それはあなたが「仕事だけ」を理解した「ブロックのみ」と言います。

スライドの内容は次のとおりです。

  • バッファがいっぱいでない場合、送信は正しく機能し、ブロックされません

  • バッファがいっぱいになると、バッファがいっぱいになるまで送信がブロックされます。

したがって、例は指定どおりに機能しています。

于 2013-03-21T09:26:00.950 に答える