Да, именно так оно и должно работать.
Когда истечет время ожидания и ваша функция-обработчик все еще работает (не вернулась), контекст запроса будет отменен. Ваш обработчик несет ответственность за мониторинг канала Done для контекста и прерывает его работу при запросе отмены. Каждый обработчик работает в своей собственной программе, и операции не могут быть убиты или прерваны "извне".
Пример того, как это сделать:
func func1(w http.ResponseWriter, req *http.Request) {
select {
case <-time.After(5 * time.Second):
fmt.Println("My func Println")
io.WriteString(w, "My func!\n")
case <-req.Context().Done():
fmt.Println("Cancelled")
}
}
Это будет выводить:
Cancelled
Если вы измените задержку в обработчике на 2 секунды:
case <-time.After(2 * time.Second):
Вывод будет:
My func Println
И клиент получит отправленные данные:
My func!