Defer Anahtar Sözcüğü: Kaynakları Güvenli Serbest Bırakma
Go'da defer, bir fonksiyonun sonunda otomatik olarak çalışacak bir komutu önceden kaydetmenin yoludur. Özellikle dosya kapama, veritabanı bağlantısını kesme veya bellek temizleme gibi işlerde çok faydalıdır.
Asıl iş bittiğinde, kaynağı kapatmayı unutma riski ortadan kalkar.
Bir fonksiyonda defer kullanırsan, o fonksiyon bitmeden hemen önce defer'de yazılan kod çalışır. Hatta fonksiyon bir hata verip çıksa bile defer yine çalışır.
Bir dosyayı açıp okuyan basit bir program yazalım. Defer olmadan yaparsak, dosyayı kapatmayı unutabiliriz:
1package main23import (4"fmt"5"os"6)78func main() {9file, err:= os.Open("test.txt")10if err!= nil {11fmt.Println("Dosya açılamadı:", err)12return13}14defer file.Close() // Fonksiyon bitince dosya kapanır1516data:= make([]byte, 100)17n, _:= file.Read(data)18fmt.Println("Okunan:", string(data[:n]))19}Çıktı (test.txt dosyasında "Merhaba" varsa):
1Okunan: MerhabaBirden fazla kaynağı açarsan, her birine defer ekle. Ters sırada kapanır (son açılan ilk kapanır):
1package main23import (4"fmt"5"os"6)78func main() {9file1, _:= os.Open("dosya1.txt")10defer file1.Close()11fmt.Println("Dosya 1 açıldı")1213file2, _:= os.Open("dosya2.txt")14defer file2.Close()15fmt.Println("Dosya 2 açıldı")1617fmt.Println("İşlemler yapılıyor...")18} // Çıkışta: Dosya 2 kapatılır, sonra Dosya 1 kapatılırÇıktı:
1Dosya 1 açıldı2Dosya 2 açıldı3İşlemler yapılıyor...1db, err:= sql.Open("mysql", "user:password@/dbname")2if err!= nil {3log.Fatal(err)4}5defer db.Close()67rows, _:= db.Query("SELECT * FROM users")8defer rows.Close()910for rows.Next() {11// Veri işle12}- defer fonksiyon bitince çalışır.
- Dosya, veritabanı, ağ bağlantısı gibi kaynakları güvenli kapatır.
- Hata durumunda bile çalışır.
- Çoklu defer'ler ters sırada kapanır.
Defer'i kullanarak "kaynağı kapatmayı unuttum" hatalarından kurtulursun.
bknz: Custom Middleware Testing: xUnit ile ASP.NET Core Pipeline Testi
5 yorum
LIFO dediğimiz şey var aga son yazılan defer ilk çalışıyor Yani tersine sırayla çalışıyor Mesela üç tane defer yazarsan üçüncüsü sonra ikincisi sonra
ama ya birden fazla defer yazarsan hangisi önce çalışıyor diye merak ediyorum
Aynen aga hata fırlatsa bile defer yine çalışıyor O yüzden kaynağı her durumda kapatmış oluyorsun başında defer yazıp geçtin mi rahat uyursun
Bence bu defer olayı çok mantıklı dosya kapatmayı unutma riski ortadan kalkıyor Hata
ha tamam tersine sırada çalışıyor yani işte böyle bilinirse en son açtığın kaynağı ilk