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 main
2
3import (
4"fmt"
5"os"
6)
7
8func main() {
9file, err:= os.Open("test.txt")
10if err!= nil {
11fmt.Println("Dosya açılamadı:", err)
12return
13}
14defer file.Close() // Fonksiyon bitince dosya kapanır
15
16data:= make([]byte, 100)
17n, _:= file.Read(data)
18fmt.Println("Okunan:", string(data[:n]))
19}

Çıktı (test.txt dosyasında "Merhaba" varsa):

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1Okunan: Merhaba

Birden fazla kaynağı açarsan, her birine defer ekle. Ters sırada kapanır (son açılan ilk kapanır):

1package main
2
3import (
4"fmt"
5"os"
6)
7
8func main() {
9file1, _:= os.Open("dosya1.txt")
10defer file1.Close()
11fmt.Println("Dosya 1 açıldı")
12
13file2, _:= os.Open("dosya2.txt")
14defer file2.Close()
15fmt.Println("Dosya 2 açıldı")
16
17fmt.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()
6
7rows, _:= db.Query("SELECT * FROM users")
8defer rows.Close()
9
10for rows.Next() {
11// Veri işle
12}
  • 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

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz
  • adlı kullanıcıya yanıt verdi
    yoldakaldim

    ha tamam tersine sırada çalışıyor yani işte böyle bilinirse en son açtığın kaynağı ilk

  • adlı kullanıcıya yanıt verdi
    persembeaksami

    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

  • adlı kullanıcıya yanıt verdi
    yoldakaldim

    ama ya birden fazla defer yazarsan hangisi önce çalışıyor diye merak ediyorum

  • adlı kullanıcıya yanıt verdi
    persembeaksami

    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

  • yoldakaldim

    Bence bu defer olayı çok mantıklı dosya kapatmayı unutma riski ortadan kalkıyor Hata