"Enter"a basıp içeriğe geçin

Go Syntax’ına Genel Bakış #2 – Değişkenler ve Fonksiyonlar

Merhabalar,

Nasıl giriş yapacağımı bilemedim o yüzden direkt konuya giriyorum. Fonksiyonlarla başlayabiliriz.

Go’da fonksiyon tanımlamak için func deyimini kullanıyoruz. Dolayısıyla metod tanımlamak için de meth deyimini kullanacağız. Şaka şaka, meth diye bir şey yok. Func dedikten sonra bir boşluk bırakıp fonksiyon adımızı yazıyoruz ve parantezler içinde parametrelerimizi belirtiyoruz. Parametrelerimizi belirtirken dikkat etmemiz gereken bir mesele var. Önce parametrenin adını yazıyoruz, daha sonra bir tane boşluk bırakıp parametrenin tipini yazıyoruz. Parantezin hemen dışına da bu fonksiyonumuzun döndüreceği veri tipini yazıyoruz. Şimdi aldığı iki parametreyi toplayıp sonucu döndüren bir fonksiyon yazalım.

func add(x int, y int) int {
  return x + y
}

Değişkenler oluştururken neden önce değişken ismi sonra da tipi yazdığımızı merak edebilirsiniz. Go’nun resmi dokümanları bu konuda şöyle diyor: “Bunun sebebi çok basit, soldan sağa doğru okuyoruz. Önce değişken isminin gelmesi okumayı kolaylaştırıyor.” (Tam olarak böyle söylemiyorlar, ben bunu anladım). Konu hakkında daha detaylı bilgi isteyen arkadaşları şuraya alabiliriz: https://blog.golang.org/gos-declaration-syntax

Bu arada, parantezin hemen sonrasına hangi tipte veri döndüreceğinizi yazdığınızı söylemiştim. Eğer bir veri döndürmeyecekseniz buraya herhangi bir şey yazmıyorsunuz. (Java’da herhangi bir veri döndürülmüyorsa bu durumda void deyimi kullanılıyordu, Go bunu tamamen ortadan kaldırmış)

Eğer isterseniz parametrelerin tipleri aynıysa bunları arka arkaya yazıp tek bir kez veri tipini yazabiliyorsunuz. Yukarıdaki örneğimizi düzenleyelim:

func add(x, y int) int {
  return x + y
}

Bu kullanım istediğiniz kadar parametrede geçerlidir.

Çoklu Değer Döndürme

Go’da en sevdiğim özelliklerden birine geldi sıra. Bir fonksiyon birden fazla veri döndürebiliyor. Şöyle bir örnek yapalım, fonksiyonumuz içerisine aldığı iki parametrenin hem çarpımını hem de toplamını versin. Fonksiyonumuzu yazalım.

func addAndMultiply(x, y int) (int, int) {
  return x + y, x * y
}

Fonksiyonumuzu bu şekilde yazdık. Peki buradan dönen değerleri değişkenlerimize aktarmak istersek nasıl yapacağız?

Bu durumda sırayla iki değişken oluşturup değer olarak fonksiyonumuzu vereceğiz. Örneği görünce daha iyi anlayacaksınız.

func main() {
  toplam, carpim := addAndMultiply(10, 6)
  fmt.Println(toplam, carpim)
}

İki tane değişkeni tek bir satır üzerinde oluşturduk ve eşittir dedikten sonra fonksiyonumuzu çağırdık. Fonksiyonumuzun döndürdüğü iki değer sırayla değişkenlerimize aktarılıyor.

İsimle Değer Döndürmek

Bu oldukça pratik bir özellik sayılabilir aslında. Hatırlarsanız fonksiyondan dönecek olan değeri fonksiyonun parametrelerini yazdığımız parantezlerden sonra belirtiyorduk. Burada eğer istersek döndüreceğimiz değere bir isim de verebiliriz. İsterseniz lafı fazla uzatmadan kodumuzu yazalım ve örneğimiz üzerinden gidelim. Bir önceki örnekte yazdığımız addAndMultiply fonksiyonunu bu şekilde baştan yazalım.

func addAndMultiply(x, y int) (toplam, carpim int) {
  toplam = x + y
  carpim = x * y
  return
}

Birinci parantezimizin içerisine parametrelerimizi yazdık. x ve y adında iki tane integer parametremiz olacağını belirttik. Daha sonra fonksiyonun hangi tipte veri döndüreceğini belirttiğimiz kısma bir parantez açtık ve tıpkı parametrelerde yaptığımız gibi iki adet değişken ismi girdik ve bunların veri tiplerini belirttik. Bu aşamadan sonra burada belirttiğimiz değişkenlere değerler atamamız gerekiyor. Burada şuna dikkat etmelisiniz, fonksiyonumuzun içerisinde toplam veya carpim değişkenlerini tekrar tanımlamadık. Bunları zaten return tipini belirtirken tanımlamış olduk. Fonksiyonun içerisinde sadece değer atamasını yaptık. Daha sonra return dediğimizde fonksiyonumuz yukarıda return tipini belirttiğimiz kısma bakıyor ve buradaki isimleri fonksiyonun içerisinde arıyor. Bulduktan sonra da bunu döndürüyor. Eğer fonksiyon içerisinde bu değişkenlerden herhangi birine yeni bir değer ataması yapılmamışsa bu durumda o veri tipinin sıfır değeri neyse o değer döndürülüyor.

Yeri gelmişken sıfır değerinin ne olduğundan da bahsedelim. Her veri tipi için bir sıfır değeri vardır. Bu değer, siz bir değişken oluşturup buna bir değer atamadığınızda bu değişkene atanan değerdir. Çeşitli veri tipleri için sıfır değerlerini inceleyelim.

Sayısal Veri Tipleri (Integer, Float…) 0
Boolean Veri Tipi false
String veriler “” (Boş bir string)

İsimle değer atama mevzusu da bu kadardı. Bitirmeden önce ufak bir not düşeyim, bu özelliği çok uzun fonksiyonlarda kullanırsanız kodunuzu okurken problem yaşayabilirsiniz.

Değişken Tanımlamak

Buraya gelene kadar aslında birçok kez değişken tanımlamış olduk ama burada yine de ayrıca bahsetmemiz gerekiyor bu konudan.

Go’da değişken tanımlamak için kullandığımız anahtar kelime var. Var ifadesinden sonra bir değişken ismi belirtiyoruz ve hemen arkasından da bu değişkenin tipini belirtmemiz gerekiyor. Aşağıdaki örnekte isActive adında bir değişken oluşturduk ve bu değişkenin veri tipini boolean olarak belirledik.

var isActive bool

Burada sadece değişkenimizi tanımlamış olduk. Değişkenimiz otomatik olarak kendi veri tipinin sıfır değerini almış oldu. Yani şu anda isActive değişkenimizin değeri false.

Buna kendimiz de bir başlangıç değeri atayabiliriz. Tek yapmamız gereken bu ifadenin sonuna bir eşittir koyup değerini atamak.

var isActive bool = true

Böylece isActive değişkenimizin değerini true yapmış olduk.

Go’da var ifadesinin kısaltılmış hali de mevcut :=

Bir örnek verirsek daha anlaşılır bir hale gelebilir.

isActive := true

Bunu yaptığımız zaman veri tipi belirtemiyoruz. Go otomatik olarak veri tipini algılıyor.

Burada dikkat etmeniz ve bilmeniz gereken bir mesele var. var anahtar kelimesini her yerde kullanabiliyor olmanıza rağmen := ifadesini sadece fonksiyonların içerisinde kullanabilirsiniz. Aşağıda gördüğünüz gibi fonksiyon dışında := ifadesiyle bir değişken tanımlama işlemi yapmaya çalıştım.

package main

isActive := true

func main() {	
}

Bu kodu derlemeye çalıştığım zaman şu şekilde bir hatayla karşılaşıyorum.

Bu hatanın bir syntax hatası olduğunu ve fonksiyon dışında bu ifadeyi kullanamayacağımızı söylüyor. (Burada bahsi geçen fonksiyon main fonksiyonu olmak zorunda değil, herhangi bir fonksiyon içerisinde bu şekilde bir tanımlamaya gidebilirsiniz.)

var ile ilgili anlatmak istediğim son bir şey kaldı. Yine bir şeyleri daha pratik yazmak adına geliştirilmiş bir özellik. Birden fazla değişken tanımlamak istersek eğer şu şekilde bir kullanıma da gidebiliyoruz:

var (
  name string = "Zahid"
  age int = 19
  isStudent bool
)

Gördüğünüz gibi sadece bir kez var anahtar kelimesini kullandım ve bundan sonra içerisine her satıra bir tane gelecek şekilde değişkenlerimi yazıp tiplerini belirttim. Hatta bazılarına değer bile atadım. Bu kullanım tarzi benim çok hoşuma gitti. Muhtemelen program yazarken kullanacağım.

Son olarak var ile ilgili göstereceğim tek bir şey kaldı ve bundan sonra yazıyı bitirebiliriz.

Değişkenlerinizi tek bir satırda arka arkaya yazarak da tanımlayabilirsiniz. Hemen bir örnek verelim.

var name, age, isStudent = "Zahid", 19, false

Go, bizim burada oluşturduğumuz değişkenlerin veri tipini otomatik olarak anlıyor ve ona göre değerlendiriyor.

Değişken ve fonksiyon tanımlama meselesi bu kadar.  Daha fazla detay isterseniz Golang.org‘dan faydalanabilirsiniz.

Başka bir yazıda görüşmek üzere…

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir