Go · Intermediário · Português · Técnico
defer em laço
Armadilha de usar defer dentro de um for: as chamadas adiadas só rodam quando a função termina, não ao fim de cada volta, acumulando recursos abertos.
Onde usar
Aparece ao abrir muitos arquivos em um laço e dar defer f.Close(): todos ficam abertos até o fim da função e podem estourar o limite de descritores. A saída é mover o corpo para uma função própria.
Em código
for _, nome := range nomes {
func() {
f, err := os.Open(nome)
if err != nil { return }
defer f.Close() // fecha a cada volta
use(f)
}()
}Exemplos
O erro too many open files veio de um defer em laço.
Mova o corpo do laço para uma função para o defer rodar a cada volta.
Cuidado
Não presuma que o defer termina junto do bloco; em Go o escopo do defer é a função, não o laço.