Горутины и каналы в Go для параллельных задач

Практические лайфхаки для разработчиков, DevOps и админов: Docker, Linux, Bash, Python, Golang, Ansible, логи и безопасность — только рабочие решения. Даем готовые команды, конфиги и приёмы диагностики, которые экономят часы и дни. Если нужно быстро настроить, отладить и обезопасить инфраструктуру — вы по адресу.

gogoroutinesканалы

👁 Если вам нужно выполнять несколько операций одновременно и эффективно управлять параллельностью, то горутины и каналы в Go — это то, что нужно. Горутину можно запустить в один момент, а каналами удобно управлять синхронизацией данных между ними.

📝 Пример кода:

package main

import (
  "fmt"
  "time"
)

func fetchData(id int, ch chan string) {
  time.Sleep(2 * time.Second) // эмуляция задержки
  ch <- fmt.Sprintf("Data from goroutine %d", id)
}

func main() {
  ch := make(chan string, 3) // канал для трёх сообщений

  for i := 1; i <= 3; i++ {
    go fetchData(i, ch) // запускаем горутину
  }

  // Получаем и выводим результаты
  for i := 1; i <= 3; i++ {
    fmt.Println(<-ch) // блокирует, пока не получит сообщение
  }
}

📌 Как это работает:

  • Горутины — с помощью go перед функцией запускаем параллельное выполнение
  • Каналы — ch используется для передачи данных между горутинами
  • Функция fetchData отправляет результат в канал после симуляции задержки
  • В main() собираем результаты с помощью блокирующего оператора <-ch

❗️ Это решение идеально подходит для задач, требующих одновременной обработки нескольких операций, таких как сбор данных с разных источников или асинхронное выполнение HTTP-запросов.

tags: #go #разработка

❤️ @recura_tech

Скриншот с примером кода на Go в тёмной теме редактора: фрагмент с горутинами и каналами, комментарии и логотип RECURA внизу
Пример кода на Go: запуск горутин и передача данных через буферизированный канал.

Читайте так же