Перейти к примеру объясняет , что по умолчанию отправка и получение канала ожидают, пока подпрограмма отправки и процедура приема не будут готовы.Эта блокировка становится очевидной с помощью следующего примера :
func main() {
ch := make(chan int)
ch <- 1
fmt.Println(<-ch)
}
Этот код приводит к взаимоблокировке, потому что единственная процедура (основная) застряла на ch <- 1
, ожидая другогогорутин, чтобы получить.Мало ли он знает, что мы ожидаем, что он будет получателем на следующей строке.
Это объясняет, почему ваш первый пример не работает, потому что другая программа не отправляет на b
до своей операции отправкина a
завершено.Но основная процедура не будет получена на a
, пока она не будет получена на b
!Так что оба застряли в ожидании навсегда.
Чтобы узнать больше об этом виде операции (называемой синхронной операцией), посмотрите это объяснение .