Defer é uma palavra reservada do Go que envia a função para uma lista de chamadas. Essas chamadas serão executadas depois que a função onde o defer se encontra terminar sua execução.
O defer é muito utilizado para realizar operações de limpeza, como por exemplo, fechar conexões com banco de dados, fechar stream de arquivos e etc…
Observe a função abaixo.
func CopyFile(dstName, srcName string) (written int64, err error) { src, err := os.Open(srcName) if err != nil { return } dst, err := os.Create(dstName) if err != nil { return } written, err = io.Copy(dst, src) dst.Close() src.Close() return }
Nele temos um bug, pois caso a função os.Create
retornar um erro o arquivo que está aberto na variável src
nunca será fechado.
Isso pode ser fácilmente corrigido adicionando o defer a função.
func CopyFile(dstName, srcName string) (int64, error) { src, err := os.Open(srcName) if err != nil { return err } defer src.Close() dst, err := os.Create(dstName) if err != nil { return err } defer dst.Close() return io.Copy(dst, src) }
A lista de chamadas do defer funciona como uma pilha (First In Last Out), ou seja, a última função adicionada será a primeira a ser executada.

Para ilustrar com código, o exemplo abaixo vai imprimir “3210”:
func exemplo() { for i := 0; i < 4; i++ { defer fmt.Print(i) } }
Deixem suas dúvidas nos comentários.
Até a próxima!
Subscreva
Fique por dentro de tudo o que acontece no mundo Go