Вы видите ошибки, потому что чтение происходит не внутри программы, а в основном потоке.
Линия:
go fmt.Println(<-ch)
оценивает параметр в главном потоке, и, как только он преуспевает, он запускает Println
в процедуре с уже разрешенным параметром. Поскольку код никогда не может записать в ch
в этом состоянии, он блокируется.
Вы можете наблюдать это, изменив его на:
go func() { fmt.Println(<-ch) }()
Затем он создаст замыкание вокруг ch
, и затем будет заблокирована анонимная подпрограмма, а не основной поток, который может перейти к send()
.