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

  1. A função main começa a executar.
  2. O primeiro defer fmt.Println("A") é agendado; a chamada é empilhada.
  3. O segundo defer fmt.Println("B") é agendado; empilhado sobre o primeiro.
  4. O terceiro defer fmt.Println("C") é agendado; empilhado sobre os anteriores.
  5. fmt.Println("Fim") é executado imediatamente, imprimindo Fim.
  6. Ao final de main, os defers são executados na ordem LIFO: primeiro C, depois B, por último A.

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 defer executa 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 de i é capturado no momento do defer, 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 use defer ou 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