cpp

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

Канал можно закрыть с помощью глобальной функции close(). Формат функции:

close(c chan<- Type)

После закрытия канала попытка записи приведет к ошибке. При этом можно читать данные из закрытого буфферизированного канала, пока там есть данные. Когда данные закончатся будет возвращено значение по умолчанию для типа, например, для целого числа будет возвращено значение 0:

ch := make(chan int, 3)
ch <- 10
ch <- 20
ch <- 30
close(ch)
fmt.Println(<-ch) // 10
fmt.Println(<-ch) // 20
fmt.Println(<-ch) // 30
fmt.Println(<-ch) // 0

На самом деле операция чтения из канала возвращает два значения. Через первое значение доступны данные или значение по умолчанию для типа, если в канале нет элементов и он закрыт. Через второе возвращаемое значение доступно true, если канал открыт, и false — если канал закрыт. Пример:

ch := make(chan int, 3)
ch <- 10
ch <- 20
ch <- 30
close(ch)
v, ok := <-ch
fmt.Println(v, ok) // 10 true
v, ok = <-ch
fmt.Println(v, ok) // 20 true
v, ok = <-ch
fmt.Println(v, ok) // 30 true
v, ok = <-ch
fmt.Println(v, ok) // 0 false

Пример получения всех данных из канала до момента его закрытия приведен в листинге 18.10.

Листинг 18.10. Закрытие канала

package main

import "fmt"

func main() {
   var ch chan int = make(chan int)
   go func() {
      for i := 0; i < 10; i++ {
         ch <- i
      }
      close(ch) // Закрываем канал
   }()
   for {
      if v, ok := <-ch; ok {
         fmt.Println(v)
      } else {
         fmt.Println("Канал закрыт")
         break // Выходим из цикла после закрытия канала
      }
   }
   fmt.Println("Конец функции main()")
}

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp