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