Bu blogumuzda Go'daki fonksiyon yapılarını inceleyeceğiz ama bu blogu okumadan önce Scope (Kapsama Alanı) isimli blogu okumanızı öneririm.
İsterseniz önce, fonksiyonların ne işe yaradığından maddeler halinde söz edelim.
Bir fonksiyonun nasıl tanımlandığından, 'kapsama alanı' denen kavramdan bahsetmiştik. Fonksiyonlar, içerisine yazdığınız kodları veya kendilerine verdiğiniz parametreleri sadece kendine özel olarak tutar. Örneğin x fonksiyonuna tanımladığınız bir değişkeni daha sonra y fonksiyonuna da tanımlayabilirsiniz. Bu kodlar veya değişkenler birbirine karışmayacaktır çünkü fonksiyonların kapsama alanı farklıdır; birbirlerini görmeyeceklerdir. Ayrıca fonksiyon tanımlama kriterleri, değişken tanımlamalarında bulunan kriterler ile neredeyse aynıdır.

Yukarıda gördüğünüz gibi bir fonksiyon tanımlanırken en başa 'func' anahtar kelimesi girilir. Daha sonra fonksiyonun ismi girilir. Fonksiyonun ismini verdikten hemen sonra bir parantez açılır ve parantezin yanına süslü bir parantez daha açılır. Yazılacak olan kodlar da bu süslü parantezlerin arasına yazılır.
Fonksiyonların başı, yukarıda da gördüğünüz üzere 'main()' fonksiyonudur. Bu fonksiyonun ismini değiştiremezsiniz. Ayrıca bu fonksiyon dışında tanımladığınız fonksiyonları 'main()' fonksiyonuna tanıtmanız gerekir. Nasıl yapıldığına bir bakalım.

Dikkatli bakın. Kırmızı, büyük kutuda main() dışında bir fonksiyon tanımlaması yaptım. Daha sonra bu fonksiyonu main() fonksiyonuna tanıttım. Bu tanıtma işlemini de sadece dışarıdaki fonksiyonun adını yazarak (parantezleri unutmadan) yaptım. Eğer bu tanıtımı main() fonksiyonuna yapmazsanız, o fonksiyona ait kodlarınız çalışmayacaktır. İsterseniz bunu da deneyelim.

Tanımladığımız fonksiyonda iki sayıyı toplayıp ekrana yazdıran birkaç satır kod yazdık. Normal şartlarda bu kodun çalışmaması için hiçbir sebep yok fakat main() fonksiyonu içerisine tanımlama yapmadığımız için bu kodlar çalışmadı; çıktı kısmına bakın, bir sonuç alamadık.

Şimdi, hiçbir değişiklik yapmadan yukarıda söylediğimiz gibi fonksiyonun ismini main() içerisine yazdık. Çıktı kısmına baktığımız zaman bu kodların çalışığını görebilirsiniz.
Fonksiyonlar parametre alabilir. Parametre olayını, değişmesi size bağlı olan veya değişmeyen değişkenleriniz varsa kullanmanız mantıklı olabilir. Örneğin KDV hesabı yapıyorsanız (%18'dir) bu oranı parametre olarak verebilirsiniz.
Örneğin bir dairenin çevresini hesapladığınızı düşünün; formül: '2 * pi * r' şeklindedir. Buradaki 'pi' sayısı ve çarpılması gereken 2 sayısı birer sabittir ve değişmesi gerekmez. Dolayısıyla bunu bir parametre olarak verebilirsiniz. 'r' yani yarıçap ise değişkendir ve bunu kullanıcıdan almanız gerekir. İsterseniz bu örneği yapalım.

Yukarıdaki görseli daha iyi görebilmeniz için üzerinde herhangi bir işaretleme yapmak istemedim fakat genel olarak ne yaptığımı anlamışsınızdır. Burada, parametreleri fonksiyonun parantezleri içerisine yazıyoruz. Parametre verirken ilk önce parametrenin ismini sonra veri tipini yazıyoruz ve eğer birden fazla parametre varsa bunları 'virgül' ile birbirinden ayırıyoruz.
Daha sonra verdiğimiz bu parametreler zaten sabit şeyler olduğu için main() fonksiyonuna bu fonksiyonu tanıtırken parametre değerlerini de giriyoruz.
Fonksiyonların mantığını anlamanız açısından bu fonksiyona ek olarak bir fonksiyon daha yazalım.

İkinci fonksiyonumuz dikdörtgenin çevresini bulmaya yarıyor. main() fonksiyonuna dikkat edin; bu fonksiyonu da kendisine tanıttık. Burada önemli olan şey, main() fonksiyonuna tanıttığınız fonksiyonların sırasıdır. Hangi fonksiyonun ilk önce çalışmasını istiyorsanız o fonksiyonu main() içerisine o sırayla yerleştirmeniz gerekir. Bu kod bize, ilk önce dairenin çevresini daha sonra da dikdörtgenin çevresini sordu çünkü main() içerisine ilk önce daire fonksiyonunu daha sonra dikdörtgen fonksiyonunu tanımladık. Eğer main() içerisine ilk önce dikdörtgen fonksiyonunu tanımlamış olsaydınız ilk önce dikdörtgen fonksiyonu çalışacaktı.
Yukarıdaki kodu yazıp test edin, pratik yapın lütfen.
returnBiz, kodlarımızı her zaman 'if, else if, else' şeklinde yazdık ama bazı durumlarda bunları kullanmamıza gerek yoktur. Hatta bazı durumlarda bunların kullanılması acemilik göstergesi olabilir. İlerledikçe, bunu kendi kafanızda oturtacaksınız. İşte bazı durumlarda bir sürü koşul ifadesi yazmak yerine basitçe 'return' yazmamız yeterli olur.

Normal şartlarca en basit kodu bile bu şekilde yazardık. Fakat bu koşulllar büyüdükçe bu kodun okunabilirliği açısından sorun yaratacaktır. İşte bu durumda biz, 'return' kullanıyoruz. Hemen görelim.

Yukarıdaki koda dikkatli bakın. Fonksiyon tanımlarken o fonksiyon bir parametre alacaksa bunları yazmayı öğrendik. Fakat bir fonksiyonda bir değeri döndürecekseniz fonksiyonun parantezlerinin dışına döndüreceğiniz verinin tipini girmeniz gerekir. Ben, kodum içerisinde metinsel bir değer döndürmek istiyorum. En üstteki turkuaz kutuya bakın lütfen. İşte oraya, döndüreceğiniz verinin tipini girmek zorundasınızdır. Eğer bu değeri vermeden 'return' kullanmaya kalkarsanız Go size bir hata verecektir.
Şimdi, yukarıdaki kodun çıktısına bakalım ve bunun ne işe yaradığına bakalım. 'sum' adında bir fonksiyon tanımladık ve içerisine 'number1' ve 'number2' olmak üzere iki değişken parametresi verdik, bu parametrelerin tiplerini de belirttik elbette. Daha sonra 'return' kulllanacağımız için return ifadesi ile vereceğimiz değerin tipini 'string' olarak belirledik ve fonksiyonun içerisine girdik.
Fonksiyonun içerisine 'answer' adında bir değişken tanımladık. Bu değişkenin görevi, number1 ve number2'nin toplamını tutmaktır. Daha sonra bir 'if' bloğu açıp koşulumuzu yazdık; 'answer 50'den küçükse'. Buradaki kodun Türkçesi tam olarak şudur: "Eğer answer'in değeri 50'den küçükse bana 'Toplamları 50'den küçük.' değerini döndür." İşte, return dediğimiz kavram tam olarak bu işe yarıyor. Bununla beraber, fmt.Println() yazmaktan da kurtuluyoruz ve Go'yu yormamış oluyoruz.
Daha sonra if'in altına normalde 'else' bloğu açardık ama dikkat ederseniz tekrar 'return' kullandık ve gerçekten de hata almadık. Bu, eğer return kullanıyorsanız else kullanmanıza gerek olmadığını ifade eder. Bu sayede karmaşık kodlardan ve hafızada boş yer kaplamaktan kurtulmuş olursunuz.

Yukarıdaki koddan da göreceğiniz üzere return ifadesini kullanmışız ama bize geri döndürülecek değerin veri tipini yazmamışız. İşte, az önce dediğimiz gibi burada bir hata ile karşılaşıyoruz.

Bunların yanında; return ifadesinden sonra herhangi bir şey de yapamıyoruz. 'return' en sonda kullanılması gereken bir komuttur. Dikkat ederseniz 'fmt.Println()' kullandık ve Go, bize buunu yapamayacağını belirtti. Çünkü zaten bir değer döndürüyoruz; fmt'ye gerek yoktur.
Yayınlanma Tarihi: 2022-08-03 00:48:51
Son Düzenleme Tarihi: 2022-08-09 20:30:52