Aula 41
Aprenda mais sobre o Defer para Adiar a Execução de Funções na Linguagem Go
Summary
Resumo sobre Defer em Go
Nesta aula, foi abordado o uso da palavra-chave defer
na linguagem Go para adiar a execução de funções. Abaixo estão os principais conceitos discutidos:
-
Uso do
defer
: Ao preceder uma chamada de função comdefer
, essa chamada é inserida em uma pilha (stack) para ser executada posteriormente, no final da função que a contém (neste caso, a funçãomain
). -
Comportamento da Stack:
- As chamadas
defer
são adicionadas ao topo da pilha. - Quando a função principal termina, as chamadas são executadas na ordem inversa à qual foram adicionadas (Last In, First Out - LIFO).
- As chamadas
-
Exemplo Prático:
- Se forem chamadas três funções
defer
(defer func1()
,defer func2()
,defer func3()
), a execução será na ordem:func3
,func2
,func1
. - Se não usar
defer
, as funções seriam executadas na ordem normal:func1
,func2
,func3
.
- Se forem chamadas três funções
-
Argumentos de Funções:
- Ao usar
defer
, os argumentos das funções são avaliados imediatamente antes da chamada ser adiada. Ou seja, se um valor for retornado por uma função chamada antes de umdefer
, ele é utilizado na chamada deferred. - Exemplo: ao chamar
println(imprimir())
, oimprimir()
é executado imediatamente, e seu retorno é utilizado na chamada deferred.
- Ao usar
-
Cuidado com
defer
:- É importante lembrar que o que é adiado é a chamada da função, e não a avaliação de seus argumentos. Assim, os valores são computados no momento da criação do
defer
, e não quando ele é executado.
- É importante lembrar que o que é adiado é a chamada da função, e não a avaliação de seus argumentos. Assim, os valores são computados no momento da criação do
Conclusão
A palavra-chave defer
permite controlar a ordem de execução de funções em Go, utilizando a pilha para gerenciar chamadas que devem ser adiadas até que a função que as contém retorne. Para usar defer
, basta adicionar a palavra antes da chamada da função desejada.
Video Transcript
Então vamos continuar a aprender como adiar a execução de funções em go com a expressão differ,
que a gente pega, pra essa palavra differ antes daquela função chamada de função que a gente quiser adiar.
Então, como a gente tinha feito,
eu vou imprimir a mensagem, essa função vai pegar e vai ser inserida numa stack, numa pilha, né?
E essa pilha, se eu tiver vários deles,
por exemplo, se você fizer dessa maneira, né?
Então ele vai pegar e vai adicionar cada uma dessas funções chamadas pra uma pilha,
que quando terminar, quando chegar no final da função main ou qualquer outra função em que o differ
estiver aparecido, né? Vai ser sempre relativo à função de fora, nesse caso main.
Ele vai fazer stack, vai pegar o primeiro, põe nessa stack, no topo da stack, tá? Aqui é o topo.
E aqui é o lá embaixo, né?
Fundo, né?
Então ele vai pegar o segundo, vai adicionar ao topo, né?
Pega o terceiro, vai adicionar ao topo e quando terminar, chegar no final da execução da função,
ele vai proceder da maneira de maneira de stack, porque sempre da stack a gente retira sempre o
elemento lá do topo, né? Não pode ir lá no fundo, sempre do topo, remove do topo,
remove esse 3, executa, remove esse 2, executa, execução.
Remove esse cara, executa, tá? Agora stack não tem mais nada, está vazia, então ele terminaria
executando dessa maneira, 3, 2 e 1, que apareceria, né?
Salvar, só demonstrar de novo.
Defer 2.go, 3, 2, 1, tá?
Então essa, se você tiver tirado defer, você quer que você esperaria 1, 2, 3, né?
Na maneira secoencial normal.
Tá?
Então defer, ele vai adiar a execução da chamada da função até o retorno da função que encobre
essa expressão, né? Nesse caso, main. Quando chegar no final de main, vai começar a execução
dos, das expressões que estão na stack do defer. Vale a pena também notar se você
tiver esses argumentos aqui, por exemplo. Nesse caso aqui, se você tivesse argumento aqui
de alguma outra função, vamos ver aqui, vamos fazer a função aqui.
Essa função não retorna nada, vai só dar o fmt println, imprimindo em texto.
Tá? Agora vamos ver o que acontece se a gente for defer, deixa esses outros aqui de,
vamos só focar no primeiro e eu chamar aqui println com o imprimir.
Na verdade, vamos ver aqui o que acontece.
Eu vou chamar o imprimir aqui.
Vamos ver o que acontece aqui.
O imprimir e usar um vale não dá, então vou deixar eu tornar um valor imprimir, tornar um string.
Então, vamos ver aqui. Eu quero botar uma função aqui, 2,
3, 3.
Eu quero demonstrar o que acontece se você tiver um argumento aqui.
E se ele vai, o que vai acontecer? Será que essa execução toda vai ser adiada?
Ou será que o imprimir vai ser chamada imediatamente, mas o println vai ser adiado?
Então vamos ver.
Então a gente espera o que? Vamos ver a noz aqui.
Então você primeiro vai chamar o imprimir.
O imprimir vai pegar aqui, vai dar o log nesse println e ele vai retorna esse valor.
Esse valor vai pegar aqui, vai ser posto aqui.
Então vai ser imediato, não vai ser adiado.
Agora essa chamada aqui é que vai ser adiada porque tem um differ.
Então o que vai acontecer?
Vai pegar esse cara, pôr lá no topo da stack.
Aí ele vai executar o 2, 3 e finalmente pega o topo da stack, executa.
E ele vai retornar, ele vai imprimir, valor de imprimir depois do 3.
Olha aqui, vamos rodar lá.
Então o que aconteceu?
Tá, pôr 2 e esqueci de reverter o imprimir.
Tá? Eu vou reverter o imprimir e vamos tentar novamente.
Então ele bateu lá no linha 11, tá?
E chamou a função imprimir na mesma hora.
O imprimir fez aquela impressão do imprimindo na linha 6 e retornou o valor.
Agora esse valor de retorno vai ser argumento do println da linha 11.
Mas agora essa chamada do println da linha 11 vai ser adiada,
por isso que não apareceu nem o println.
Então ele procedeu para a próxima linha de 2 e 3,
enquanto esse println do imprimir, do differ,
estava dá na stack para ser executada quando chegar no final da função main.
Então você note que depois do 3 aqui, que chama o println com o valor de imprimir,
que fora retornada pelo imprimir, que foi adiada, linha 11.
Tá certo?
Então é importante você entender que, apesar de que differ esteja escrita aqui,
os argumentos aqui para o print não são adiados.
Na verdade, são já executados na mesma hora que está sendo adiado.
Na verdade, essa chamada aqui de fora.
Então tome cuidado com isso.
Lembre-se de que sempre as entradas que forem,
que você chama differ, serão sempre adicionadas sempre ao topo da stack.
Não é no fundo, sempre ao topo.
E por causa disso, quando você inserte no topo,
a última inserção ao topo vai ser a primeira a ser executada quando chegar lá no final.
A chamada no inglês é last in, first out.
A última entrada vai ser a primeira saída, porque é uma pilha, uma stack.
Então tem esse início também.
Então com isso a gente vai concluir essa aula de differ,
para poder adiar a execução de funções, a chamada de funções na linguagem go.
Basta adicionar a palavra chave differ antes da sua chamada de função.
Quando você fizer isso, a chamada da função será adicionada a uma pilha,
que quando você chegar ao final da função que encobre essa expressão do differ,
ele vai começar a executar todas as chamadas que foram adiadas.
A execução à ordem será do topo da stack até o fundo.
Então a última função que for adiada,
será sempre a primeira a ser executada.
E a primeira que for adicionada à stack será a última.
Bom, por essa aula é só e até a próxima.
Nenhum comentário ainda (loading...)
Nenhum comentário ainda (loading...)
Gostou da aula? 😆👍
Apoie nosso trabalho com uma doação: