Defer

Defer #

// _Defer_ ကို ပရိုဂရမ်ရဲ့ လုပ်ဆောင်မှုအတွင်းမှာ function call တစ်ခုကို နောက်ပိုင်းမှ
// လုပ်ဆောင်စေဖို့ သုံးပါတယ်။ အများအားဖြင့် cleanup လုပ်ဖို့ ရည်ရွယ်ချက်နဲ့ သုံးလေ့ရှိပါတယ်။
// တခြားဘာသာစကားတွေမှာ `ensure` နဲ့ `finally` သုံးတဲ့နေရာမျိုးတွေမှာ Go က `defer` ကို
// မကြာခဏ သုံးပါတယ်။

package main

import (
	"fmt"
	"os"
)

// ဖိုင်တစ်ခု ဖန်တီးပြီး၊ ဖိုင်အထဲကို ရေးမယ်၊ ပြီးရင် ပိတ်ပစ်မယ်ဆိုပါစို့။
// `defer` ကိုသုံးပြီး ဒီလိုလုပ်လို့ရပါတယ်။
func main() {

	// `createFile` နဲ့ file object ရရှိပြီးတာနဲ့ ချက်ချင်း
	// အဲဒီဖိုင်ကို ပိတ်မယ့် `closeFile` ကို defer လုပ်ထားလိုက်ပါတယ်။
	// ဒါက လက်ရှိ function (`main`) ပြီးဆုံးချိန်မှာ၊
	// `writeFile` ပြီးသွားတဲ့နောက်မှာ အလုပ်လုပ်ပါလိမ့်မယ်။
	f := createFile("/tmp/defer.txt")
	defer closeFile(f)
	writeFile(f)
}

func createFile(p string) *os.File {
	fmt.Println("creating")
	f, err := os.Create(p)
	if err != nil {
		panic(err)
	}
	return f
}

func writeFile(f *os.File) {
	fmt.Println("writing")
	fmt.Fprintln(f, "data")

}

func closeFile(f *os.File) {
	fmt.Println("closing")
	err := f.Close()
	// Deferred function ထဲမှာတောင် ဖိုင်ပိတ်တဲ့အခါ
	// error စစ်ဖို့ အရေးကြီးပါတယ်။
	if err != nil {
		fmt.Fprintf(os.Stderr, "error: %v\n", err)
		os.Exit(1)
	}
}
# ပရိုဂရမ်ကို run လိုက်တဲ့အခါ ဖိုင်ထဲကို ရေးပြီးမှ
#  ပိတ်သွားတာကို အတည်ပြုပြသထားပါတယ်။
$ go run defer.go
creating
writing
closing