Используете GoLand? Он подсказывает:
Possible resource leak, 'defer' is called in the 'for' loop.
A "defer" statement invokes a function whose execution is deferred to the moment the surrounding function returns, either because the surrounding function executed a return statement , reached the end of its function body , or because the corresponding goroutine is panicking .
Предупреждение говорит о том, что defer код будет выполнен только при завершении функции, а не итерации цикла. В вашем случае это предупреждение неактуально, но проще немного переписать код, чтобы не было "ругани":
func (app App) Shutdown() {
for _, shutdown := range app.onShutdown {
if err := shutdown(); err != nil {
log.Println(err)
}
}
}
...
defer app.Shutdown()