В чем смысл вызова функции cancel как функции defer? Внутри себя context.WithTimeout создает горутину, которая будет храниться в памяти в течение 4 секунд или до тех пор, пока не будет вызвана cancel. Следовательно, вызов cancel в качестве функции defer означает, что при выходе из родительской функции контекст будет отменен, а созданная горутина остановлена. Это мера предосторожности, чтобы при возвращении мы не оставили в памяти сохраненные объекты.
Теперь перейдем ко второму аспекту контекстов Go — сигналам отмены (cancellation signals).