РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
822 of 1593 menu

Канал chan

Канал chan представляет собой типизированный конвейер, через который горутины могут отправлять и получать данные для синхронизации и обмена информацией. При объявлении канала указывается тип передаваемых значений.

Каналы бывают небуферизированными и буферизированными. Небуферизированный канал блокирует отправку до тех пор, пока другая горутина не выполнит операцию приема. Буферизированный канал позволяет отправлять данные до тех пор, пока буфер не заполнится.

Синтаксис

ch := make(chan int) // небуферизированный канал для int ch := make(chan string, 5) // буферизированный канал для string

Для создания канала используется встроенная функция make, которой передается тип канала с указанием типа данных и опционально - вместимость буфера.

Пример

Давайте создадим небуферизированный канал для передачи строк между горутинами:

package main import "fmt" func main() { ch := make(chan string) go func() { ch <- "Hello from goroutine" }() msg := <-ch fmt.Println(msg) }

Результат выполнения кода:

"Hello from goroutine"

В этом примере мы создали канал ch для строк, запустили горутину, которая отправляет в него сообщение, и в основной горутине получили это сообщение.

Пример

Давайте создадим буферизированный канал на 2 элемента и отправим в него несколько значений без блокировки:

package main import "fmt" func main() { ch := make(chan int, 2) ch <- 1 ch <- 2 fmt.Println(<-ch) fmt.Println(<-ch) }

Результат выполнения кода:

1 2

Буферизированный канал позволяет отправлять значения без ожидания получателя, пока буфер не заполнится.

Пример

Давайте используем канал для передачи результата длительной операции из горутины:

package main import "fmt" func main() { ch := make(chan int) go func() { result := 0 for i := 1; i <= 5; i++ { result += i } ch <- result }() res := <-ch fmt.Println(res) }

Результат выполнения кода:

15

Каналы обеспечивают безопасную передачу данных между горутинами без использования явных блокировок.

Смотрите также

  • оператор send,
    который используется для отправки данных в канал
  • оператор receive,
    который используется для получения данных из канала
  • конструкцию select,
    которая позволяет ожидать несколько операций с каналами
  • функцию close-chan,
    которая закрывает канал для дальнейшей отправки данных
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить