Это основная концепция каналов Go (или других версий CSP, таких как библиотека core.async Clojure), которые они блокируют. В общем, как уже упоминалось, там уже два типа каналов:
- буферном, которые блокируют, если буфер заполнен.
- небуферизован, какой блок, если нет «Рандеву», то есть должен быть кто-то, кто ставит (
c <-
), чтобы и тот, кто принимает (<- c
) из канала.
В вашем конкретном случае выполнения Go достаточно умны, чтобы обнаружить, что нет ни одного человека, который будет когда-нибудь 3
из канала c
. Следовательно, это deadlock и (к счастью) ошибка.
Что вы обычно делаете, когда вы работаете с каналами используются goroutines (проверка this introduction), который нерест легкого поточно-управляемый Go во время выполнения, чтобы выполнить тело по совместительству:
c := make(chan int)
go func() { c <- 3 }() // Create a new gorountine that puts 3 to the channel
fmt.Println(<- c) // Take 3 from the channel and print it in the main thread
Я думаю, это потому, что разница между буферизованными и небуферизованными каналами. В буферизованных каналах отправитель ожидает, пока получатель (сам в этом случае) получит данные. Но я не уверен. –
Возможный дубликат [Как сделать (chan bool) вести себя иначе, чем make (chan bool, 1)?] (Http://stackoverflow.com/questions/20041392/how-does-makechan -bool-себя-разному: от-makechan-BOOL-1) – Matt