ExpertiDict

Go · Intermediário · Português · Técnico

defer em laço

/deˈfɛʁ ẽj ˈla.su/substantivo

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.

Veja também

Todos os termos de Go