Defer: Kaynakları Kapatmayı Unutmayın! defer Kullanımı

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Katılım
7 Ocak 2026
Mesajlar
71
Tepkime puanı
2
Puanları
8

Arkanı Topla​

Programlamada bir dosya açtıysanız kapatmalı, bir veritabanı bağlantısı açtıysanız iade etmelisiniz. Genelde bunu fonksiyonun sonunda yaparız. Ama ya fonksiyonun ortasında bir hata oluşur ve return ile çıkılırsa? O zaman kapatma kodu çalışmaz ve kaynak sızıntısı (leak) oluşur.

defer anahtar kelimesi, yanındaki fonksiyonu bulunduğu fonksiyon bitmeden hemen önce çalıştırır. Nerede return ettiğinizin önemi yoktur.

Kod:
package main

import ("fmt""os")

func dosyaOku() {fmt.Println("Dosya açılıyor...")f, err := os.Open("deneme.txt")if err != nil {fmt.Println("Hata:", err)return}

// Dosya açılır açılmaz kapatma emrini erteleyerek (defer) veriyoruz.<br>// Bu satır, fonksiyonun en sonunda çalışacak.<br>defer f.Close()<br><br>fmt.Println("Dosya üzerinde işlemler yapılıyor...")<br>// Burada 100 satır kod olabilir veya hata oluşup çıkılabilir.<br>// f.Close() her senaryoda çalışacaktır.<br>
}

func main() {// LIFO (Last In First Out) Mantığı// Defer'ler bir yığın (stack) gibi çalışır. En son giren, ilk çıkar.defer fmt.Println("1. Kapanış")defer fmt.Println("2. Kapanış")defer fmt.Println("3. Kapanış")

fmt.Println("Ana İşlem")<br>// Çıktı sırası: Ana İşlem -&gt; 3 -&gt; 2 -&gt; 1<br>
}

Sonuç​

defer, kodun okunabilirliğini artırır ve unutkanlığı önler. Açtığınız kaynağın hemen altına defer kapat() yazmak Go'da bir reflekstir.
 
Geri
Üst