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