no-defer-in-loop
Default severity: warning
Configuration: severity and path excludes
Reports defer statements nested inside for or range loops. Deferred calls
run when the surrounding function returns, not when the current iteration
ends, so resources can accumulate for the entire loop.
for _, filename := range filenames { file, err := os.Open(filename) if err != nil { return err } defer file.Close()}for _, filename := range filenames { if err := processFile(filename); err != nil { return err }}
func processFile(filename string) error { file, err := os.Open(filename) if err != nil { return err } defer file.Close() return consume(file)}A defer inside a function literal declared within the loop is not reported: that defer belongs to the nested function and runs when that invocation ends.
Suppress
Section titled “Suppress”//strider:ignore no-defer-in-loopfor range smallFixedSet { defer releaseAtFunctionExit()}