2012-08-13 14 views

Odpowiedz

110

Rozmiar bufora to liczba elementów, które można wysłać do kanału bez blokowania wysyłania. Domyślnie kanał ma rozmiar buforu równy 0 (otrzymujesz go z make(chan int)). Oznacza to, że każde wysyłanie zostanie zablokowane, dopóki inny goroutine nie odbierze kanału. Kanał od wielkości bufora 1 może pomieścić 1 elementu aż wysyłanie bloków, więc można dostać

c := make(chan int, 1) 
c <- 1 // doesn't block 
c <- 2 // blocks until another goroutine receives from the channel 
+17

Dobra odpowiedź. Effective Go ma ładny rozdział zatytułowany "Współbieżność", który objaśnia kanały. Gorąco polecam: http://golang.org/doc/effective_go.html – Levi

+0

Daj mi z tym radę i make (chan int, 1) pozwala na przekazanie 3 wartości do mojego kanału przed zablokowaniem (testowanie go za pomocą log.Printlns), a domyślne jest zezwalanie na 2 wejścia przed blokowaniem. Każdy pomysł, dlaczego: – Mauricio

+0

@Mauricio To brzmi dość dziwnie. Właśnie testowałem używając Go 1.8.3 lokalnie, a także korzystając z funkcji "Spróbuj Go" na https://golang.org, aw obu przypadkach nadal zachowuje się tak, jak udokumentowałem w mojej odpowiedzi. –

2

Poniższy kod ilustruje blokowanie niebuforowanym kanału:

// to see the diff, change 0 to 1 
c := make(chan struct{}, 0) 
go func() { 
    time.Sleep(2 * time.Second) 
    <-c 
}() 
start := time.Now() 
c <- struct{}{} // block, if channel size is 0 
elapsed := time.Since(start) 
fmt.Printf("Elapsed: %v\n", elapsed) 

można grać z kodem here .