Explorar o código

SVI Добавление примеров

SVI %!s(int64=2) %!d(string=hai) anos
pai
achega
406717f519
Modificáronse 1 ficheiros con 38 adicións e 0 borrados
  1. 38 0
      docs/lesson02.md

+ 38 - 0
docs/lesson02.md

@@ -13,6 +13,8 @@
     - [Что не так с длиной канала](#что-не-так-с-длиной-канала)
   - [Пример](#пример)
   - [Работа с select](#работа-с-select)
+  - [Пример мультиплексора](#пример-мультиплексора)
+  - [Пример демультиплексора](#пример-демультиплексора)
 
 Каналы в `go` являются попыткой решить проблему безопасности данных в конкуретной среде.
 Это неидеальная попытка реализовать [монитор Хоара](https://ru.wikipedia.org/wiki/Монитор_(синхронизация)). Неидеальность связана с тем, что подавляющая часть решений в `go` продиктована несколькими соображениями:
@@ -184,6 +186,42 @@ select{
 }
 ```
 
+## Пример мультиплексора
+
+```golang
+// Скорость освобождения канала зависит от скорости чтения потребителя из него
+chOut := make(chan int, 10) // Канал с ограничением на ёмкость
+
+// В коде ниже нет проверки на закрытие каналов чтения
+for {
+    select{
+        case msg :=<- chSig1: // Взять из первого канала
+            chOut <- msg
+        case msg :=<- chSig2: // Взять из второго канала
+            chOut <- msg
+    }
+}
+```
+
+## Пример демультиплексора
+
+```golang
+// Скорость освобождения канала зависит от скорости чтения потребителя из него
+chOut1 := make(chan int, 10) // Канал с ограничением на ёмкость
+chOut2 := make(chan int, 10) // Канал с ограничением на ёмкость
+
+func run(chIn <-chan int){
+    for msgIn :=range chIn{
+        switch msgIn.OutChan {
+            case 1: // Отправить в первый канал
+                chOut1 <- msg.PayLoad
+            case 2: // Отправить во второй канал
+                chOut <- msg.PayLoad2
+        }
+    }
+}
+```
+
 Примеры использования каналов:
 
 [Статья на Хабре](https://habr.com/ru/articles/278349/)