Closures

GO programlama dilinde fonksiyon içerisinde çağrılabilen isimsiz fonksiyonlar closure ifadeleri olarak tanımlanırlar.

Closure ifadeleri genellikle tekrarlanan yapıları kısaca ifade etmek için kullanılırlar.

Yazım şekilleri isimsiz bir fonksiyon şeklindedir:


x := func()int{
  // y degiskeni - işleme dahil olup çıktıya yansıtılacak degisken
  return y
}

Bir örnek ile ifade etmek gerekirse:

func main() {
  x := 0
  arttir := func() int {
    x++
    return x
  }
  fmt.Println(arttir())
  fmt.Println(arttir())
}

Yukarıdaki ifadede arttir() isimli closure ifadesi her çağrıldığında x değerini bir arttırıp sonuç döndürür. Bu yüzden başlangıçta 0 olan x değeri, bu ifadede iki defa arrtir() çağrıldığından dolayı 1 ve 2 değerleri ekrana yazdırılır.

Closure ifadelerinin Fonksiyon Çıktılarına Yazdırılması

Closure ifadeleri yalnızca değişkenlere atanmakla kalmaz aynı zamanda başka bir fonksiyonun return ifadesi sonrasında gelecek değerleri de işleme tabi tutmak amacıyla kullanılabilirler.

Örneğimizi inceleyelim :


func CiftYazdir() func() uint {
  i := uint(0)
  return func() (ret uint) {
    ret = i
    i += 2
    return
  }

Şimdi ifademizi main() fonksiyonumuzla çalıştıralım :


func main() {
  yeniCift := CiftYazdir()
  fmt.Println(yeniCift()) // 0
  fmt.Println(yeniCift()) // 2
  fmt.Println(yeniCift()) // 4
}

Toplu olarak kodumuzu görüntüleyelim :


func CiftYazdir() func() uint {
  i := uint(0)
  return func() (ret uint) {
    ret = i
    i += 2
    return
  }

  func main() {
  yeniCift := CiftYazdir()
  fmt.Println(yeniCift()) // 0
  fmt.Println(yeniCift()) // 2
  fmt.Println(yeniCift()) // 4
}

Şimdi burada gerçekleşen işlemleri inceleyelim. Öncelikle CiftYazdir() isimli func ifademizi inceleyelim.


func CiftYazdir() func() uint {

  i := uint(0) // unsigned integer olarak sıfır değeri i ye atandı

  return func() (ret uint) {
    ret = i // ret isimli değeri isleme girecek i degerine ata
    i += 2 // i degerini her calistirmada 2 arttır
    return
  }
}

Fonksiyonumuzda öncelikle başlangıc değeri olan i := uint(0) değerini tanımladık. Fonksiyonumuz her çalıştığında i +=2 ile i değişkenine 2 ilave eder ve bu değeri ret isimli bir değişkene atar. closure ifademiz uint olarak ret değerini döndürür. Böylece CiftYazdir() isimli fonksiyonumuzun return değeri closure ifademizden gelen sayıya eşitlenir.

Programımızı çalıştırdığımızda ekrana aşağıdaki çıktı gelecektir:

0
2
4