Ответ
В Go для работы с размерами канала используются две встроенные функции: cap() для ёмкости и len() для текущего количества элементов.
1. Ёмкость канала — cap()
Функция cap() возвращает ёмкость (capacity) канала, то есть размер его буфера. Это максимальное количество элементов, которое можно отправить в канал без блокировки.
- Для буферизированных каналов
cap()вернет размер буфера, указанный при создании. - Для небуферизированных каналов
cap()всегда возвращает0.
// Буферизированный канал
bufChan := make(chan int, 5)
fmt.Println(cap(bufChan)) // Вывод: 5
// Небуферизированный канал
unbufChan := make(chan int)
fmt.Println(cap(unbufChan)) // Вывод: 02. Текущее количество элементов — len()
Функция len() возвращает текущее количество элементов, находящихся в буфере канала.
ch := make(chan int, 3)
fmt.Printf("Ёмкость: %d, Длина: %dn", cap(ch), len(ch))
ch <- 1
ch <- 2
fmt.Printf("Ёмкость: %d, Длина: %dn", cap(ch), len(ch))
<-ch
fmt.Printf("Ёмкость: %d, Длина: %dn", cap(ch), len(ch))
// Вывод:
// Ёмкость: 3, Длина: 0
// Ёмкость: 3, Длина: 2
// Ёмкость: 3, Длина: 1⚠️ Важное замечание: В реальном коде редко полагаются на len() для управления потоком данных в конкурентных программах. Состояние канала может измениться между вызовом len() и следующей операцией. Вместо этого используются блокирующие операции чтения/записи, select или закрытие канала для синхронизации горутин.