Закрытие каналов: примеры закрытия
1. М получателей, один отправитель, отправитель говорит «больше не отправляет», закрывая канал данных
Это самая простая ситуация. Просто позволь отправителю закрыть канал данных, когда он не хочет больше отправлять

Пришло время поработать с кодом!
2. Один получатель, N отправителей, единственный получатель говорит «пожалуйста, прекратите отправлять», закрывая дополнительный сигнальный канал
Это ситуация немного сложнее, чем описанная выше. Мы не можем позволить приемнику закрыть канал данных, чтобы остановить передачу данных, так как это нарушит принцип закрытия канала. Но мы можем позволить получателю закрыть дополнительный сигнальный канал, чтобы уведомить отправителей о прекращении отправки значений.
Пришло время поработать с кодом!
Для дополнительного канала сигнала его отправитель является получателем канала данных. Канал дополнительного сигнала закрывается его единственным отправителем, который придерживается принципа закрытия канала.
В этом примере канал dataCh никогда не закрывается. Да, каналы не должны быть закрыты. Канал в конечном итоге будет удален сборщиком мусора, если никакие горутины больше не ссылаются на него, независимо от того, закрыт он или нет. Таким образом, грациозность закрытия канала здесь не в том, чтобы закрыть канал.
3. M получателей, N отправителей, любой из них говорит «давайте закончим игру», уведомляя модератора о закрытии дополнительного канала сигнала
Это сложнейшая ситуация. Мы не можем позволить ни получателям, ни отправителям закрыть канал данных. И мы не можем позволить любому из получателей закрыть дополнительный сигнальный канал, чтобы уведомить всех отправителей и получателей о выходе из игры. Выполнение любого из них нарушит принцип закрытия канала. Однако мы можем ввести роль модератора, чтобы закрыть дополнительный сигнальный канал. Один трюк в следующем примере заключается в том, как использовать операцию try-send, чтобы уведомить модератора о закрытии дополнительного сигнального канала.
Пришло время поработать с кодом!
В этом примере сохраняется принцип закрытия канала.
Обратите внимание, что размер буфера (емкость) канала toStop равен единице. Это делается для того, чтобы избежать пропуска первого уведомления при его отправке до того, как горутина модератора будет готова получить уведомление от toStop.
Мы также можем установить пропускную способность toStop канала как сумму отправителей и получателей, тогда нам не нужен блок попытки отправки select для уведомления модератора.

Пришло время поработать с кодом!
4. Вариант ситуации «М получателей, один отправитель»: запрос на закрытие делает сторонняя горутина
Иногда необходимо, чтобы сигнал закрытия был сделан сторонней горутиной. В таких случаях мы можем использовать дополнительный сигнальный канал, чтобы уведомить отправителя о закрытии канала данных.
Например, в этом коде, с которым ты можешь поработать, необходим сигнал сторонней горутины.
5. Вариант ситуации «N отправителей»: канал данных должен быть закрыт, чтобы сообщить получателям, что отправка данных завершена
В решениях для описанных выше ситуаций с N-отправителями, чтобы придерживаться принципа закрытия канала, мы избегаем закрытия каналов данных. Однако иногда требуется, чтобы каналы данных были закрыты в конце, чтобы получатели знали, что отправка данных завершена. В таких случаях мы можем преобразовать ситуацию с N отправителями в ситуацию с одним отправителем, используя промежуточный канал. Средний канал имеет только одного отправителя, поэтому мы можем закрыть его вместо закрытия исходного канала данных.
Пришло время поработать с кодом!
Вариантов ситуаций должно быть больше, но показанные выше являются наиболее распространенными и основными. При грамотном использовании каналов и других методов параллельного программирования всегда можно найти решение, поддерживающее принцип закрытия канала для каждого варианта ситуации.
Нет ситуаций, которые заставят нас нарушить принцип закрытия канала. Если ты столкнулся с такой ситуацией, пожалуйста, переосмысли свой дизайн и перепиши код.
Программирование с помощью каналов Go похоже на искусство!
С оригиналом статьи ты можешь ознакомиться по ссылке.