> Как запустить две задачи параллельно и дождаться их результата (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: Юрент

Стек: Go

> Пример ответа

В Go для параллельного запуска двух задач и ожидания их результатов используется комбинация горутин и каналов или sync.WaitGroup. Вот пример с sync.WaitGroup:

GO
package main
import (
"fmt"
"sync"
)
func task1(wg *sync.WaitGroup, result chan<- int) {
defer wg.Done()
// Имитация работы
result <- 42
}
func task2(wg *sync.WaitGroup, result chan<- string) {
defer wg.Done()
// Имитация работы
result <- "hello"
}
func main() {
var wg sync.WaitGroup
ch1 := make(chan int, 1)
ch2 := make(chan string, 1)
wg.Add(2)
go task1(&wg, ch1)
go task2(&wg, ch2)
wg.Wait() // Ожидаем завершения обеих задач
res1 := <-ch1
res2 := <-ch2
fmt.Println(res1, res2) // 42 hello
}

Альтернатива с каналами (без WaitGroup, если нужно получить результат сразу после завершения каждой задачи):

GO
func main() {
ch1 := make(chan int)
ch2 := make(chan string)
go func() { ch1 <- 42 }()
go func() { ch2 <- "hello" }()
res1 := <-ch1
res2 := <-ch2
fmt.Println(res1, res2)
}

Ключевые моменты:

  • sync.WaitGroup - для синхронизации завершения горутин.
  • Каналы - для передачи результатов.
  • Буферизированные каналы (размер 1) предотвращают блокировку при записи до чтения.
  • В мобильной разработке (например, с Gomobile) используйте аналогичный подход, но учитывайте ограничения на горутины в UI-потоке.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью