O que é e como funciona o defer

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

Deixe uma resposta