Merhabalar,
Bu yazıda Go dilinde bir fonksiyon olan defer fonksiyonun ne işe yaradığından bahsedip , ufak bir örnek paylaşacağım.
Defer fonksiyonuyla tanımlanan fonksiyon veya işlem içinde olduğu fonksiyonun çalışması tamamlanmadan çalışmamaktadır.
Örnek olarak alttaki kodun çıktısı eğer defer olmasaydı
hello
world
şeklinde olacaktı. ama defer ile tanımlandığı için fonksiyon diğer tüm işlemlerden sonra çalıştığı için bu kod parçacığının çıktısı :
world
hello
olacaktır.
package main
import “fmt”
func main() { // fonksiyon çalışmaya başlıyor
defer fmt.Println(“world”) // defer tanımı geldi ekrana çıktı verilmiyor işlem sıradafmt.Println(“hello”) // hello ekrana basıldı ve sonrasında herhangi bir işlem olmadığı için defer tanımlı işleme geri dönülüp o gerçekleştirildi
}
mantığını kavramak için biraz daha farklı bir örnek yapalım. alttaki kodda başlangıçta bağlantımız kapalı. baglanti,baglantikes ve mudahaleet adında üç fonksiyonumuz mevcut. main içerisinden mudahaleEt ‘i çağırdım. baglantikes fonksiyonunu defer ile çalıştırdım. amaç bütün işlemler sona erdikten sonra bağlantının açık kalmaması. en altta kodun çıktısından göreceğiniz üzere sıra olarak ortada olmasına rağmen tüm işlemler gerçekleştikten sonra çalışmakta. fakat sadece kendi bulunduğu blok için geçerli. main içerisinde ondan sonra yazdığım fmt komutu defer’den sonra çalışabiliyor o kısıma dikkat edelim. umarım açıklayıcı olmuştur.
package mainimport (“fmt”)var baglanti = falsefunc main() {fmt.Println(“baglanti kuruluyor”)mudahaleEt()fmt.Printf(“son durumda baglanti : %v\n “, baglanti)}func mudahaleEt() {Baglan()fmt.Println(“defer işlemi geliyor”)defer BaglantiKes()fmt.Printf(“baglanti durumu %v\n “, baglanti)fmt.Println(“test komutu calistirildi”)}func Baglan() {baglanti = truefmt.Println(“baglanti kuruldu”)}func BaglantiKes() {baglanti = falsefmt.Println(“baglanti kesildi”)}
baglanti kuruluyor
baglanti kuruldu
defer işlemi geliyor
baglanti durumu true
test komutu calistirildi
baglanti kesildi
son durumda baglanti : false