Почему эта программа производит вывод

Я новичок в GO от Google. В буферизованных каналах вот программа:

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 не заполнится в первом выражении. ?


person footy    schedule 20.03.2013    source источник


Ответы (2)


У вашего канала размер буфера равен двум. Вы вставляете один int, а затем вытаскиваете один int. Затем вы спите и повторяете процесс. Канал не будет заблокирован, пока вы не попытаетесь вставить третье целое число, не вытягивая никаких целых чисел. Первые два целых числа будут буферизованы.

person Daniel    schedule 20.03.2013

Я думаю, вы не поняли слайд должным образом. Там написано "только блокировать", вы поняли "только работа".

На слайде сказано:

  • Если буфер не заполнен, то ваш посыл будет работать правильно и не будет блокироваться.

  • Если буфер заполнен, то ваш посыл будет заблокирован до тех пор, пока буфер не будет заполнен.

Итак, ваш пример работает, как указано.

person zk82    schedule 21.03.2013