Go: Entendendo o defer

Lucas Eduardo
3 min readDec 23, 2020

--

A palavra chave "defer" no Go, é utilizada para garantir que uma função será chamada quando a execução do seu código for finalizada. Isso ajuda muito na limpeza de recursos, pois garantimos que a função seja chamada no fim da execução do nosso programa.

De uma forma simples, podemos dizer que uma operação marcada com defer, só será executada quando a função onde essa operação se encontra, retornar. Vamos dar uma olhadinha em um exemplo, para fixar melhor essa ideia.

No exemplo acima, a primeira função Println está marcada com defer, enquanto que a segunda não. Se executarmos esse código, teremos o seguinte resultado:

Como podemos ver, primeiro foi imprimido Hello, e em seguida, World. A ordem acabou ficando diferente, mas por que isso acontece?

Bom, como explicado anteriormente, a palavra chave defer, "adia" a execução da função até o momento que a função na qual ela está sendo chamada, retorna. No nosso caso, essa função é a main, e quando ela retornar algo, nossa função marcada com defer, será executada.

Esse exemplo é legal para entender um pouco sobre o defer, mas agora, vamos ver um caso de uso mais interessante.

Nesse segundo exemplo, temos três funções principais:

CreateFile -> cria um arquivo

WriteFile -> escreve algum conteúdo no arquivo

CloseFile -> fecha o arquivo

Essas são as três operações que podemos fazer nesse nosso programa de exemplo. Cada função possui, além de sua operação intrínseca, um Println, para podermos ver a ordem de execução de cada função.

Ao observarmos o nosso método main, nós primeiramente estamos executando a função CreateFile, para criar um arquivo chamado test.txt. Em seguida chamamos a função CloseFile, usando o defer. Por fim, chamamos a função WriteFile, para colocarmos algum conteúdo no arquivo.

Agora, vamos executar nosso programa, para podermos ver o resultado.

Como podemos ver, a função CloseFile foi chamada por último, mesmo tendo sido chamada em segundo, na ordem de execução do nosso sistema.

Isso é importantíssimo, pois garante que nossa função de fechar o arquivo seja chamada ao fim das nossas operações, facilitando a limpeza de recursos.

Agora, e se tivermos mais de uma função marcada com defer? Nesse caso, a ordem de execução é feita no formato last-in-first-out (LIFO), ou seja, a última função marcada com defer, será executada primeiro, a penúltima em seguida, etc.

Eu acrescentei uma função OpenFile, para lidar com abertura de arquivos, e adicionei ela antes da nossa chamada á função CloseFile e além disso, a marquei com defer.

Ao executarmos nosso código, podemos ver a ordem da seguinte forma:

Como podemos ver, a função CloseFile foi chamada antes de OpenFile, mesmo tendo sido chamada após ela na nossa pilha de execução. Isso demonstra bem o funcionamento do LIFO, que comentei anteriormente.

A palavra chave defer é um recurso muito importante da linguagem Go, pois com ela conseguimos garantir a limpeza de recursos de uma forma muito mais eficaz.

Espero que eu tenha ajudado você a ter um entendimento melhor sobre a keyword defer e que tenha simplificado ela com esses exemplos simples, mas que demonstram bem o poder desse recurso.

muito obrigado por ler ❤

--

--