Закрытие канала в Go

Закрытие канала в Go выполняется с помощью встроенной функции close. Она сигнализирует получателям, что в канал больше не будут отправляться новые данные. Закрытие канала полезно для корректного завершения горутин и предотвращения deadlock'ов. Функция close принимает один параметр - канал, который нужно закрыть. Важно: закрывать можно только каналы, отправлять данные в закрытый канал нельзя - это вызовет панику.

Синтаксис

goclose(ch)

Пример

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

gopackage main

import "fmt"

func main() {
  ch := make(chan int)

  go func() {
    ch <- 42
    close(ch)
  }()

  res := <-ch
  fmt.Println(res)
}

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

go42

Пример

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

gopackage main

import "fmt"

func main() {
  ch := make(chan int, 2)

  ch <- 1
  ch <- 2
  close(ch)

  for i := 0; i < 3; i++ {
    res, ok := <-ch
    fmt.Printf("%d, %t\n", res, ok)
  }
}

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

go"1, true"
"2, true"
"0, false"

Пример

Использование закрытия канала для корректного завершения горутины при переборе значений с помощью range:

gopackage main

import "fmt"

func main() {
  ch := make(chan int)

  go func() {
    for i := 1; i <= 5; i++ {
      ch <- i
    }
    close(ch)
  }()

  for res := range ch {
    fmt.Println(res)
  }
}

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

go"1"
"2"
"3"
"4"
"5"

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

  • функцию chan,
    которая создает канал для передачи данных между горутинами
  • функцию buffered-chan,
    которая создает буферизированный канал
  • функцию unbuffered-chan,
    которая создает небуферизированный канал
  • функцию send,
    которая описывает отправку данных в канал