UNDER CONSTRUCTION !

This is not the final version of the site

UNDER CONSTRUCTION !

This is not the final version of the site

UNDER CONSTRUCTION !

This is not the final version of the site

การใช้ defer ใน Golang

Feb 22, 2025

ใน Golang นั้น "defer" ใช้ในการเลื่อนการทำงานของฟังก์ชั่นออกไปจนกว่าฟังก์ชั่นที่ครอบมันจะสิ้นสุด


ตัวอย่างแบบ basic

package main

import "fmt"

func main() {
	fmt.Println("Start")

	defer fmt.Println("This will run last")

	fmt.Println("End")
}


ผลลัพธ์ที่ได้คือ

Start
End
This will run last


จะเห็นได้ว่าแม้ defer จะอยู่ตรงกลาง แต่ก็ทำงานหลังสุด


defer กับการ Evaluated ค่า


defer นั้นจะ evaluate ค่า argument ทันที แต่จะ execute ฟังก์ชั่นที่ defer หลังจาก return จากฟังก์ชั่นที่ครอบอยู่


ตัวอย่างเช่น

package main

import "fmt"

func main() {
	x := 1

	defer fmt.Println("deferred x:", x)

	x = 2

	fmt.Println("x:", x)
}


ผลลัพธ์ที่ได้จะเป็น

x: 2
deferred x: 1

จะสังเกตได้ว่า ถึงแม้ defer จะ print ทีหลัง แต่ค่าของ x ที่ถูกส่งเข้าไปใน function println นั้นถูก evaluated ก่อนที่จะปรับค่า x เป็น 2


การใข้ defer หลายตัว


ตัวอย่างเช่น

package main

import "fmt"

func main() {
	defer fmt.Println("First")
	defer fmt.Println("Second")
	defer fmt.Println("Third")
}


จะได้ผลลัพธ์คือ

Third
Second
First


นั่นก็เพราะ defer ทำงานแบบ LIFO หรือ Last in, First Out นั่นเอง

กล่าวคือคำสั่งที่ถูก defer ทีหลังจะถูก execute ก่อน