Go'da, defer ifadeleri yakındaki fonksiyonlar dönene kadar bir fonksiyonun, metodun veya anonim bir metodun yürütülmesini geciktirir. Başka bir deyişle, erteleme işlevlerine veya yöntemlerine verilen argümanlar hemen değerlendirilir, ancak yakındaki işlevler dönene kadar yürütülmezler. Defer anahtar sözcüğünü kullanarak ertelenmiş bir yöntem, fonksiyon veya anonim fonksiyon oluşturabilirsiniz.

Sözdizimi:
// 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
}()
Önemli Not:
- Go dilinde aynı program içerisinde birden fazla defer ifadesine izin verilir ve bunlar Örnek 2'de gösterildiği gibi LIFO (Son Giren İlk Çıkar) sırasına göre yürütülür.
- Erteleme ifadelerinde, argümanlar erteleme ifadesi çağrıldığında değil, yürütüldüğünde değerlendirilir.
- Erteleme ifadeleri sıklıkla dosyaların ihtiyaç sona erdiğinde kapatılmasını sağlamak, kanalları kapatmak veya programdaki sorunları yakalamak için kullanılır.
Şimdi daha iyi anlamak için bir örneğe bakalım.
Örnek 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()
}
Sonuç:
Result: 1035
Hello!, Quantrimang.com
Result: 1288
Açıklama: Yukarıdaki örnekte mul() ve show() adında iki fonksiyonumuz var . show () fonksiyonu normalde main() fonksiyonu içerisinde çağrılırken , mul() fonksiyonu iki farklı şekilde çağrılır:
- Öncelikle mul fonksiyonunu normal şekilde (defer anahtar sözcüğü olmadan) çağırıyoruz, yani mul(23, 45) ve fonksiyon çağrıldığında o da çalışıyor (Çıktı: Sonuç: 1035).
- İkinci olarak, mul() fonksiyonunu defer anahtar sözcüğünü kullanarak bir defer fonksiyonu olarak çağırıyoruz, yani defer mul(23, 56) ve çevredeki tüm metotlar döndüğünde (Çıktı: Sonuç: 1288) yürütülüyor.
Örnek 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)
}
Sonuç:
Start
Result: 20
Result: 90
End