В зависимости от того, как был написан код, он может работать и без ошибок, и с ошибками. Проблема может возникать из-за ошибок в синтаксисе или других программных ошибок, которые могут не быть очевидными для разработчика.
Когда канал done не является буферизованным, оба писатель (ch<-val) и читатель (<-ch) должны быть готовы для выполнения операции записи и чтения соответственно. В первом случае, писатель может быть готов для записи, но нет читателя, поэтому выполнение потока приостанавливается, пока появится читатель. Однако, поскольку читатель определен в том же потоке, его никогда не будет. В результате, программа зависает и может вызвать ошибку. Чтобы исправить это, можно сделать канал буферизованным, например, done := make(chan book, 1). Во втором случае, потоки писателя и читателя находятся в разных потоках выполнения и могут дожидаться друг друга.
Канал done, который не является буферизированным, означает, что для выполнения операции записи в канал должны быть готовы как писатель (ch<-val), так и читатель (<-ch). Первый вариант означает, что писатель готов произвести операцию записи, но у него нет читателя. В этом случае, поток выполнения приостанавливается до появления читателя. Однако, читатель определен в том же потоке, поэтому никогда не будет доступен. Это может привести к зависанию программы и возможно даже к ошибке. Эту проблему можно исправить, сделав канал буферизированным: done := make(chan book, 1) Второй случай работает, потому что писатель и читатель находятся в разных потоках и могут дождаться друг друга.