канал <- значение // Блокирующая передача
<-канал // Прием данных и их уничтожение
x := <-канал // Прием и сохранение данных
x, ok := <-канал // Как и выше, плюс проверка - открыт ли канал и имеются ли данные
Замечания
Действуют по принципу FIFO
Создание канала
Создать канал можно с помощью функции make и объявляются конструкцией chan Тип:
make(chanТип)// синхронный каналmake(chanТип,емкость)// асинхронный (буферизированный) канал// Пример:messages:=make(chanstring,10)// 10 - размер буфера// однонаправленные каналыchan<-Тип// описывает канал, позволяющий только посылать значения<-chanТип// описывает канал, позволяющий только принимать значения
Если буфер заполнен, нельзя будет писать в канал, пока не будет извлечен хотя бы один элемент (по умолчанию размер буфера - 0). Канал, в котором буфер имеет нулевой размер, может использоваться для отправки значений, только когда на другом конце канала ожидается прием данных. (Эффекта неблокирующих каналов можно добиться с помощью инструкции select)
Обычно каналы создаются для обеспечения обмена данными между go-подпрограммами. Блокирующее поведение каналов можно использовать для синхронизации.
Закрытие канала
Закрыть канал может только sender, не receiver. Отправка данных в закрытый канал вызовет panic. Каналы работают не так, как файлы: их не обязательно закрывать. Закрывайте, если вам необходимо сообщить получателю, что данных больше не будет (например в цикле через range).
Пример:
Пример
select
Оператор select позволяет горутине ожидать выполнения нескольких коммуникационных операций.
select блокируется до тех пор, пока не будет запущен один из его вариантов, а затем он выполнит этот case. Он выбирает один случайным образом, если готовы несколько.
Подробнее про этот statement см в разделе Процедурное программированее / Ветвления.