Запустите goroutine, выбирающую между чтением и отменой, а затем между отправкой и отменой. Отдельная проверка отмены при отправке не даст зависнуть без получателя.
Как работает отменяемая функция Pipe для канала
Запустите 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 может выбрать передачу; строгий запрет поздних результатов требует дополнительного контракта.