Prechádzať zdrojové kódy

SVI Добавление кода

SVI 2 rokov pred
rodič
commit
e63400fe9d
1 zmenil súbory, kde vykonal 25 pridanie a 0 odobranie
  1. 25 0
      docs/lesson02.md

+ 25 - 0
docs/lesson02.md

@@ -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/)