Как работает отменяемая функция Pipe для канала

Запустите goroutine, выбирающую между чтением и отменой, а затем между отправкой и отменой. Отдельная проверка отмены при отправке не даст зависнуть без получателя.

Короткий ответ

Что ответить на собеседовании

Запустите goroutine, выбирающую между чтением и отменой, а затем между отправкой и отменой. Отдельная проверка отмены при отправке не даст зависнуть без получателя.

Подробный разбор

Ответ с пояснениями

Условие

В Go нужно перенаправлять значения из входного канала int в новый выходной канал до закрытия входа или отмены context. Выход закрывает сама Pipe. Как реализовать?

Ответ

Запустите goroutine, выбирающую между чтением и отменой, а затем между отправкой и отменой. Отдельная проверка отмены при отправке не даст зависнуть без получателя.

Реализация:

func Pipe(ctx context.Context, in <-chan int) <-chan int {
    out := make(chan int)
    go func() {
        defer close(out)
        for {
            select {
            case <-ctx.Done(): return
            case value, ok := <-in:
                if !ok { return }
                select {
                case out <- value:
                case <-ctx.Done(): return
                }
            }
        }
    }()
    return out
}

Если отмена и передача готовы одновременно, select может выбрать передачу; строгий запрет поздних результатов требует дополнительного контракта.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее