tgoop.com/golang_lib/458
Create:
Last Update:
Last Update:
🧵 Три способа использовать каналы в Go
Каналы в Go — мощный инструмент для взаимодействия между горутинами. Рассмотрим три идиоматичных способа их использования:
1. Fan-out (расщепление задач)
Fan-out — это когда несколько воркеров читают из одного канала задач. Это позволяет обрабатывать задачи параллельно:
ch := make(chan int)
for i := 0; i < 3; i++ {
go func() {
for task := range ch {
doWork(task)
}
}()
}
Задачи отправляются в
ch
, и любая из горутин может их подобрать и обработать.2. Fan-in (агрегация результатов)
Fan-in — это сбор результатов от нескольких источников в один канал. Используется, когда у нас несколько генераторов данных:
ch1 := make(chan int)
ch2 := make(chan int)
out := make(chan int)
go func() {
for {
select {
case v := <-ch1:
out <- v
case v := <-ch2:
out <- v
}
}
}()
Мы слушаем оба канала и всё складываем в
out
, где далее можно агрегировать или обрабатывать данные.3. Pipelines (конвейеры обработки)
Конвейеры — это цепочки обработки, где выход одного этапа — это вход следующего. Каждый шаг может быть реализован как горутина, соединённая каналами:
func gen() <-chan int {
out := make(chan int)
go func() {
for i := 0; i < 10; i++ {
out <- i
}
close(out)
}()
return out
}
func square(in <-chan int) <-chan int {
out := make(chan int)
go func() {
for v := range in {
out <- v * v
}
close(out)
}()
return out
}
for v := range square(gen()) {
fmt.Println(v)
}
Такой стиль позволяет писать легко тестируемый, модульный и читаемый код.
https://www.dolthub.com/blog/2024-06-21-channel-three-ways/
👉 @golang_lib
BY Библиотека Go (Golang) разработчика

Share with your friend now:
tgoop.com/golang_lib/458