Вопрос проверяет понимание конкурентного программирования в Go, включая использование горутин и каналов для параллельного выполнения задач.
В Go для параллельного выполнения задач используются горутины — легковесные потоки, которые позволяют запускать функции асинхронно. Для обмена данными между горутинами применяются каналы, которые обеспечивают безопасную передачу информации. Это особенно полезно, когда нужно одновременно получить данные из нескольких источников, таких как база данных, внешний API или файловая система, чтобы сократить общее время выполнения.
package main
import (
"fmt"
"sync"
)
func fetchFromDB(result chan<- string, wg *sync.WaitGroup) {
defer wg.Done()
// Имитация запроса к БД
result <- "Data from DB"
}
func fetchFromAPI(result chan<- string, wg *sync.WaitGroup) {
defer wg.Done()
// Имитация запроса к API
result <- "Data from API"
}
func main() {
resultChan := make(chan string, 2)
var wg sync.WaitGroup
wg.Add(2)
go fetchFromDB(resultChan, &wg)
go fetchFromAPI(resultChan, &wg)
wg.Wait()
close(resultChan)
for res := range resultChan {
fmt.Println(res)
}
}Использование горутин и каналов в Go позволяет эффективно выполнять параллельные задачи, такие как получение данных из нескольких источников, что значительно ускоряет работу приложения. Этот подход рекомендуется применять в микросервисах, веб-серверах и любых системах, где важна производительность и асинхронность.