ใน Go คำสั่ง deferจะทำให้การดำเนินการของฟังก์ชันหรือวิธีการหรือวิธีการที่ไม่ระบุชื่อล่าช้าจนกว่าฟังก์ชันใกล้เคียงจะกลับมา กล่าวอีกนัยหนึ่ง อาร์กิวเมนต์ในการเลื่อนฟังก์ชันหรือวิธีการจะได้รับการประเมินทันที แต่จะไม่ดำเนินการจนกว่าฟังก์ชันใกล้เคียงจะส่งคืน คุณสามารถสร้างวิธีการที่เลื่อนออกไป ฟังก์ชัน หรือฟังก์ชันที่ไม่ระบุชื่อได้โดยใช้คำสำคัญ defer

รูปแบบประโยค :
// Hàm
defer func func_name(parameter_list Type)return_type{
// Code
}
// Phương thức
defer func (receiver Type) method_name(parameter_list){
// Code
}
defer func (parameter_list)(return_type){
// code
}()
หมายเหตุสำคัญ:
- ในภาษา Go อนุญาตให้มีคำสั่ง defer หลายคำสั่งในโปรแกรมเดียวกัน และจะดำเนินการตามลำดับ LIFO (Last-In, First-Out) ดังที่แสดงในตัวอย่างที่ 2
- ในคำสั่ง defer อาร์กิวเมนต์จะได้รับการประเมินเมื่อมีการดำเนินการคำสั่ง defer ไม่ใช่เมื่อมีการเรียกใช้
- คำสั่ง Defer มักใช้เพื่อให้แน่ใจว่าไฟล์ถูกปิดเมื่อถึงเวลาใช้งาน หรือเพื่อปิดช่อง หรือเพื่อตรวจจับปัญหาในโปรแกรม
มาดูตัวอย่างเพื่อให้เข้าใจดีขึ้นกันดีกว่า
ตัวอย่างที่ 1:
// Chương trình Go minh họa
// khái niệm của lệnh defer
package main
import "fmt"
// Các hàm
func mul(a1, a2 int) int {
res := a1 * a2
fmt.Println("Result: ", res)
return 0
}
func show() {
fmt.Println("Hello!, Quantrimang.com")
}
// Hàm chính
func main() {
// Gọi hàm mul()
// Tại đây hàm mul hoạt động
// như một hàm bình thường
mul(23, 45)
// Gọi hàm mul()
// Dùng từ khóa defer
// Hàm the mul()
// là hàm defer
defer mul(23, 56)
// Gọi hàm show()
show()
}
ผลลัพธ์:
Result: 1035
Hello!, Quantrimang.com
Result: 1288
คำอธิบาย:ในตัวอย่างข้างต้น เรามีฟังก์ชันสองฟังก์ชันชื่อmul()และshow( ) ในขณะที่ ฟังก์ชัน show()จะถูกเรียกตามปกติใน ฟังก์ชัน main()ฟังก์ชันmul()จะถูกเรียกในสองวิธีที่แตกต่างกัน:
- ขั้นแรก เราเรียกใช้ฟังก์ชัน mul ตามปกติ (โดยไม่ใช้คำสำคัญ defer) นั่นคือ mul(23, 45) และจะดำเนินการเมื่อเรียกใช้ฟังก์ชัน (เอาต์พุต: ผลลัพธ์: 1035)
- ประการที่สอง เราเรียกใช้ฟังก์ชัน mul() เป็นฟังก์ชัน defer โดยใช้คีย์เวิร์ด defer นั่นคือ defer mul(23, 56) และจะดำเนินการ (เอาต์พุต: ผลลัพธ์: 1288) เมื่อส่งคืนวิธีการโดยรอบทั้งหมด
ตัวอย่างที่ 2:
// Minh họa chương trình Go
// dùng nhiều lệnh defer, để minh họa chính sách LIFO
package main
import "fmt"
// Các hàm
func add(a1, a2 int) int {
res := a1 + a2
fmt.Println("Result: ", res)
return 0
}
// Hàm chính
func main() {
fmt.Println("Start")
// Nhiều lệnh defer
// Triển khai theo thứ tự LIFO
defer fmt.Println("End")
defer add(34, 56)
defer add(10, 10)
}
ผลลัพธ์:
Start
Result: 20
Result: 90
End