В Go есть несколько способов передачи задач. Один из самых простых способов - использование каналов.
Каналы в Go представляют собой специальный тип данных, который позволяет обмен информацией между горутинами (легковесными потоками исполнения). Они представлены ключевым словом chan
и определены как тип данных, например chan int
или chan string
.
Для создания канала используется функция make
, которая принимает тип канала и возвращает канал этого типа. Вот пример создания канала типа int
:
ch := make(chan int)
Кроме того, каналы могут быть однонаправленными, то есть только для чтения или только для записи. Это может быть полезно, если вы хотите ограничить доступ к каналу только для чтения или записи.
Операции чтения и записи в канал называются recv
и send
соответственно. Для чтения из канала можно использовать оператор <-
, например x := <- ch
, а для записи в канал используется оператор ->
, например ch <- x
.
Пример использования каналов для передачи задачи может выглядеть следующим образом:
func worker(tasks <-chan int, results chan<- int) { for task := range tasks { result := doTask(task) results <- result } } func main() { numTasks := 10 tasks := make(chan int, numTasks) results := make(chan int, numTasks) // Запускаем горутины через анонимную функцию go func() { for i := 0; i < numTasks; i++ { tasks <- i } close(tasks) }() // Запускаем горутины for i := 0; i < numWorkers; i++ { go worker(tasks, results) } // Собираем результаты for i := 0; i < numTasks; i++ { result := <-results fmt.Println(result) } }
В этом примере мы создали два канала: tasks
и results
. Мы создали несколько горутин worker
, которые читают значения из канала tasks
, выполняют какую-то задачу и записывают результат в канал results
. В основной горутине мы генерируем задачи и отправляем их в канал tasks
, а затем собираем результаты из канала results
.
Таким образом, использование каналов позволяет нам передавать задачу между горутинами в Go.