|
|
@@ -12,6 +12,7 @@
|
|
|
- [Как определить есть ли что-то в канале](#как-определить-есть-ли-что-то-в-канале)
|
|
|
- [Что не так с длиной канала](#что-не-так-с-длиной-канала)
|
|
|
- [Пример](#пример)
|
|
|
+ - [Работа с select](#работа-с-select)
|
|
|
|
|
|
Каналы в `go` являются попыткой решить проблему безопасности данных в конкуретной среде.
|
|
|
Это неидеальная попытка реализовать [монитор Хоара](https://ru.wikipedia.org/wiki/Монитор_(синхронизация)). Неидеальность связана с тем, что подавляющая часть решений в `go` продиктована несколькими соображениями:
|
|
|
@@ -162,3 +163,27 @@ func runReader (chProd <-chan int){
|
|
|
chProd := runWriter()
|
|
|
runReader(chProd)
|
|
|
```
|
|
|
+
|
|
|
+## Работа с select
|
|
|
+
|
|
|
+`select` умеет работать не только с каналами на чтение, но и на запись.
|
|
|
+
|
|
|
+```golang
|
|
|
+select{
|
|
|
+ case <-chEnd: // Канал на азкрытие
|
|
|
+ return
|
|
|
+ case msg:=<-chMsg: // Прилетело сообщение
|
|
|
+ sf.useMsg(msg)
|
|
|
+ case sysMsg, isOk:=<-chSysMsg: // Прилетело системное сообщение
|
|
|
+ if !isOk{ // Канал закрыт
|
|
|
+ return
|
|
|
+ }
|
|
|
+ sf.useSysMsg(sysMsg)
|
|
|
+ case chSig<-1: // Условное действие на отправку, если свободен сигнал/
|
|
|
+ sf.sendSig()
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Примеры использования каналов:
|
|
|
+
|
|
|
+[Статья на Хабре](https://habr.com/ru/articles/278349/)
|