Anonymous Functions

Anonymous Function ifadeleri isimsiz fonksiyon ifadeleridir. Fonksiyonların içinde satır içi işlemleri yapmak için idealdirler. function literal yani fonksiyon değişmezi olarak da isimlendirilirler.

Anonymous Function Yazım Şekilleri

Anonymous Function ifadelerinin yazım şekilleri aşağıdaki gibidir:


func(parameter_list){
// code..

}()

Eğer return tipi belirlenmişse aşağıdaki şekilde yazılırlar:


func(parameter_list)(return_type){
// code..

return
}()


Anonymous Function Uygulaması

İlk örneğimiz üzerinden kısaca açıklayalım :

package main 

import "fmt"

func AnonSelamlama() {

	// bir degiskene anonim fonksiyon atanması
	deger := func() {
		fmt.Println("Merhaba Dünya!")
	}
	deger() // value isimli degisken bir fonksiyon gibi davranır

}

func main(){
  AnonSelamlama()
}

Bu örneğimizde deger isimli ifade bir anonim fonksiyon atandıktan sonra bir fonksiyon gibi çalışmakta ve bu değişken çağrıldığında anonim fonksiyon içindeki değerler görüntülenmektedir. deger isimli değişkenimiz, isimsiz bir fonksiyon atandıktan sonra fonksiyon işlemlerini gerçekleştirmiş ve fonksiyon içindeki değeri döndürmüştür. Bu örnekte zaten fmt.Println ile yaptığımız bir işlemi anonymous function ile tekrar yazıyoruz. Burada yalnızca bir örnek teşkil ettiği ve konuyu anlattığı için yazım açısından faydasını tartışmadan bir diğer örneğe geçiyoruz :

package main

import "fmt"

func main() {

	// anonymous function with arguments
	var toplama = func(sayi1, sayi2 int) {
		toplam := sayi1 + sayi2
		fmt.Println("toplam :", toplam)
	}

	// function call
	toplama(5, 3)

}

Bu işlemde toplama isimli değişkenimize func(sayi1,sayi2 int) {} şeklinde bir anonymous function atadık. İşlemimiz 5 ve 3 değişkenlerinin anonymous function aracılığıyla toplayıp toplama isimli değişkene atıyoruz. toplama isimli değişken fonksiyona atanır ve değişkenimiz fonksiyon gibi davranmaya başlar. Çalıştırdığımız anda ekranda aşağıdaki çıktıyı elde ederiz:

toplam : 8

Anonymous Function ve return

Buraya kadar olan kısımda henüz return ifadesi ile birlikte bir anonymous function ifadesi kullanmadık. Yani bir değer döndürmesini istemedik. Fonksiyon sonucunu görüntüledik. Şimdi bu fonksiyondan return ile bir değer döndürmesini isteyeceğiz.

package main
import "fmt"

func main() {

  // anonymous function
  var sum = func(n1, n2 int) int {
    sum := n1 + n2
    return sum
  } 

  result := sum(5, 3) // fonksiyon ifademizi cagırdık 

  fmt.Println("Toplam :", result)

}

Yukarıdaki işlemde sum isimli değişkene bir anonymous function atadık.

var sum = func(n1, n2 int) int {
	sum := n1 + n2 
	return sum 
	}

Sonrasında ise sum ifadesini result isimli başka bir değişkene atadık.

result:= sum(5,3)

result isimli değişkeni ekrana yazdırdığımızda 5 ve 3 sayılarını sum() isimsiz fonksiyon ifadesine göre toplayıp sonucu ekrana sekiz olarak yazdıracaktır.

Yukarıdaki sum anonymous function ifadesini daha da kısa yazdırmak istersek aşağıdaki şekilde yazdırabiliriz:

var sum = func(n1,n2 int)int{
	return n1 + n2 
}

Anonymous Function ifadesini Başka Bir Fonksiyonun Argümanı Olarak Kullanma

Bir anonymous function ifadesini başka bir fonksiyon içerisinde parametre olarak kullanabiliriz.


package main
import "fmt"


// regular function to calculate square of numbers
func findSquare(num int) int {
  square := num * num
  return square
}

func main() {

  // anonymous function that returns sum of numbers
  sum := func(number1 int, number2 int) int {
    return number1 + number2
}

  // function call
  result := findSquare(sum(6, 9))
  fmt.Println("Result is:", result)

}

Yukarıdaki örnek daha önce yaptığımız örneğe benzerlik gösteriyor. Bu örnekte kare alma işlemi için bir fonksiyon yazılmış ve isimsiz fonksiyonla yapılan toplama işlemi sonucu buraya parametre olarak verilmiştir.

func findSquare(num int) int {
  square := num * num
  return square
}

fonksiyonu aracalığıyla kare alma işlemini gerçekleştiriyoruz. Ardından da main() isimli fonksiyonda result isimli fonksiyonumuza bir isimsiz fonksiyon anonymous function ifadesi atıyoruz.

func main() {

  // anonymous function that returns sum of numbers
  sum := func(number1 int, number2 int) int {
    return number1 + number2
}

  // function call
  result := findSquare(sum(6, 9))
  fmt.Println("Result is:", result)

}

Bir Fonksiyon ifadesinde Return ile Anonymous Function Döndürme

Bu vakte dek anonymous function ifadelerinin parametre olarak kullanımını, değişkene atanmasını gördük. Şimdi ise return ifadesine atanmalarını göreceğiz. Bu ifade GO programlama dilinde en çok karşınıza çıkacak ifadelerden biridir.

Yazımı aşağıdaki şekildedir:



func FuncName() func() int {
 
  // code for FuncName() function 
  return func() int{
    // code for anonymous function 
    return  anonymous_function_return 
  }
}

Hemen örneğimiz ile başlayalım :

package main
import "fmt"

// anonim fonksiyon ifadesi 
func SayiGoruntule() func() int {
	sayi := 10
	return func() int {
		sayi++
		return sayi
	}
}

func main() {

	degisken := SayiGoruntule()
	fmt.Println(degisken())
	fmt.Println(degisken())
	fmt.Println(degisken())
	fmt.Println(degisken())
	fmt.Println(degisken())
}

Yukarıdaki ifadede neler yaptığımızı kesitlere bölerek anlatalım. İlk olarak fonksiyonun mantığından bahsedelim. Yukarıda yazdığımız fonksiyon her seferinde çıktı değerini sistem girdisi olarak alıp bir arttırmak üzere tasarlandı. Yani number isimli değişkenimiz eğer bir anonymous function ifadesine girdi olmasaydı ilk atandığı değer olan 10 değeriyle sistem dışına çıkacaktı. Fakat biz bu değeri her seferinde return ifadesi aracılığıyla sisteme tekrar dahil ediyoruz.

// anonim fonksiyon ifadesi 
func SayiGoruntule() func() int {
	sayi := 10
	return func() int {
		sayi++
		return sayi
	}
}

fonksiyonumuzu şimdi parçalara ayıralım :

func SayiGoruntule() func() int {
  sayi := 10 
  return ...
}

Burada sistemin çıktısının bir anonymous function geleceğini ve bu fonksiyonun da int döndürüleceğini belirttik. Yukarıdaki gösterimde ... ile gösterilen yere anonymous function ifademizi yazdık. sayi isimli değişkeni anonymous function ifadesine girdi olarak alacağız. Şimdi ... içinde kalan kısmı inceleyelim:


func() int {
		sayi++
		return sayi

Sayı ifadesini girdi olarak al ve sayi++ ifadesiyle değeri 1 arttır ve return ifadesiyle çıktı olarak döndürür.

Bu fonksiyonun özelliği her çalıştırıldığı anda en son değişken değerini girdi olarak kabul etmesidir. Yani ilk çalıştırdığımızda 10 değerini 1 olarak arttırır ve 11 yapar. İkinci defa çalıştırdığımızda bu sefer en son değerimiz olan 11 değerini sistem hafızasından alır ve 1 arttırarak 12 olarak döndürür.

Şimdi kodumuzu çalıştırdığımız anda aşağıdaki çıktıyı elde ederiz:

11
12
13
14
15