select компилируется в вызов runtime.selectgo(). Сначала случайно перемешиваются case-ы (чтобы не было starvation). Потом для каждого case проверяется, можно ли выполнить операцию сразу. Если да — выполняется и всё. Если нет — горутина создаёт sudog для каждого case и встаёт в очередь каждого канала. Когда любой канал готов, соответствующий sudog пробуждается, остальные sudog удаляются из очередей. Блокировка каналов происходит в определённом порядке (по адресу) чтобы избежать deadlock при lock ordering.
Как работает select statement внутри?
Senior
390 просмотровAFK Offer AI
Что такое amortized complexity?