package main

import (
	"fmt"
	"os"
)

func urutanLIFO() {
	defer fmt.Println("defer 1: didaftarkan pertama, dijalankan terakhir")
	defer fmt.Println("defer 2")
	defer fmt.Println("defer 3: didaftarkan terakhir, dijalankan pertama")
	fmt.Println("-- urutanLIFO mulai --")
}

func argumenDievaluasiSaatDefer() {
	nilai := 10
	defer fmt.Println("argumen defer menangkap nilai:", nilai)
	nilai = 99
	fmt.Println("nilai setelah diubah:", nilai)
}

func loopDanDefer() {
	fmt.Println("mendaftarkan defer dalam perulangan")
	for i := 1; i <= 3; i++ {
		defer fmt.Println("argumen i =", i)
	}
}

func tutupBerkas() {
	berkas, err := os.CreateTemp("", "defer-demo-*.txt")
	if err != nil {
		fmt.Println("gagal membuat berkas:", err)
		return
	}
	defer berkas.Close()
	fmt.Println("berkas sementara dibuat dan ditutup otomatis saat fungsi selesai")
}

func main() {
	urutanLIFO()
	argumenDievaluasiSaatDefer()
	loopDanDefer()
	tutupBerkas()
}
