Fácil Go
Ordem LIFO com defer
Enunciado
Escreva um programa que use defer para imprimir as mensagens A, B e C na ordem inversa de declaração. O programa deve declarar três defer consecutivos e, em seguida, imprimir Fim.
Requisitos
- Usar exatamente três declarações
defer. - As mensagens devem ser impressas na ordem
C,B,A. - Após os defers, imprimir
Fim.
Código inicial
package main
import "fmt"
func main() {
// Seu código aqui
}
Saída esperada
C
B
A
Fim
Ver dica
Lembre-se: defer empilha as chamadas e as executa na ordem inversa (LIFO).
Mostrar solução
package main
import "fmt"
func main() {
// Declara três defers; serão executados na ordem inversa
defer fmt.Println("A")
defer fmt.Println("B")
defer fmt.Println("C")
// Esta linha executa antes dos defers
fmt.Println("Fim")
}
Passo a passo
- A função
maincomeça a executar. - O primeiro
defer fmt.Println("A")é agendado; a chamada é empilhada. - O segundo
defer fmt.Println("B")é agendado; empilhado sobre o primeiro. - O terceiro
defer fmt.Println("C")é agendado; empilhado sobre os anteriores. fmt.Println("Fim")é executado imediatamente, imprimindoFim.- Ao final de
main, os defers são executados na ordem LIFO: primeiroC, depoisB, por últimoA.
Por que funciona
Cada defer adiciona uma chamada a uma pilha interna da função. Quando a função retorna, essa pilha é desempilhada, executando as chamadas na ordem inversa à que foram declaradas. Isso garante que recursos sejam liberados na ordem correta, por exemplo, fechar um arquivo antes de fechar a conexão que o criou.
Erros comuns
- Achar que
deferexecuta imediatamente:defer fmt.Println("A")não imprime nada na hora; só agenda. - Esquecer que os argumentos são avaliados na declaração: em
defer fmt.Println(i), o valor deié capturado no momento dodefer, não na execução. - Ordem incorreta: se você declarar
defer A,defer B,defer C, a saída seráC,B,A. Se quiser a ordem original, não usedeferou inverta a declaração.
Outra forma de resolver
Se a ordem desejada fosse A, B, C, poderíamos usar uma função anônima com defer e chamar as impressões dentro dela, mas isso não é idiomático. A solução com defer é a mais direta para demonstrar LIFO.
Saída esperada
C
B
A
Fim