İçindekiler
Bir programı ilginç yapan şey yalnızca komutları sırayla çalıştırması değil, koşullara göre karar verebilmesi ve gerektiğinde aynı işi tekrar tekrar yapabilmesidir. Go dilinde bu akış yönetiminin iki ana kahramanı vardır: karar almak için if-else, tekrar etmek için ise neredeyse her role bürünen for döngüsü.
``
Akış yönetimi neden önemlidir?
Bilgisayar programını küçük bir karar makinesi gibi düşünebiliriz. Elimizde bir durum, yani değişkenler vardır; program bu durumlara bakar ve hangi yoldan ilerleyeceğine karar verir. Matematiksel olarak bir koşul çoğu zaman şu mantıksal ifadeye benzer:
$sonuc = (yas \ge 18) \land (puan > 50)$
Burada ifade true ise bir blok, false ise başka bir blok çalışır. Go’da koşullar parantez içine alınmaz; bu, dilin sade ve okunabilir olma tercihidir.
package main
import "fmt"
func main() {
puan := 72
if puan >= 85 {
fmt.Println("Harika!")
} else if puan >= 50 {
fmt.Println("Geçtin, ama kahveye devam.")
} else {
fmt.Println("Tekrar deneme zamanı.")
}
}
Bu örnekte program, puan değerine göre yalnızca bir yolu seçer. if ilk doğru koşulu yakaladığında devamındaki else if bloklarına bakmaz. Yani akış, gereksiz kontrol yapmadan ilerler.
| Yapı | Ne zaman kullanılır? | Go’daki not |
|---|---|---|
if |
Tek bir koşul kontrol edilecekse | Koşul parantezsiz yazılır |
else if |
Birden fazla alternatif varsa | Sıralama önemlidir |
else |
Hiçbir koşul sağlanmazsa | Varsayılan yol gibidir |
if içinde kısa değişken tanımlama
Go’nun tatlı özelliklerinden biri, if satırında küçük bir hazırlık yapabilmektir. Bu özellikle hata kontrolünde çok görülür.
package main
import "fmt"
func main() {
if sayi := 42; sayi%2 == 0 {
fmt.Println("Çift sayı:", sayi)
} else {
fmt.Println("Tek sayı:", sayi)
}
}
Burada sayi yalnızca if-else bloğunun içinde yaşar. Bu sayede değişkenin kapsamı dar tutulur. Daha az kapsam, daha az kafa karışıklığı demektir.
Go’da tek döngü: for
Go’da while veya do-while anahtar kelimeleri yoktur. İlk bakışta eksiklik gibi görünür, ama for o kadar esnektir ki hepsinin görevini üstlenir. Klasik kullanım üç parçadan oluşur:
$baslangic \rightarrow kosul \rightarrow guncelleme$
package main
import "fmt"
func main() {
toplam := 0
for i := 1; i <= 5; i++ {
toplam += i
}
fmt.Println("Toplam:", toplam)
}
Bu kodda i değeri 1’den 5’e kadar ilerler ve toplam hesaplanır. Döngünün çalışma maliyetini kabaca $O(n)$ olarak düşünebiliriz; çünkü tekrar sayısı, veri boyutu ile doğru orantılıdır.
| Döngü biçimi | Örnek | Benzer olduğu yapı |
|---|---|---|
Klasik for |
for i := 0; i < n; i++ |
C tarzı döngü |
Koşullu for |
for x < 10 |
while |
Sonsuz for |
for {} |
Sonsuz döngü |
range ile for |
for i, v := range liste |
Koleksiyon gezme |
while gibi for kullanımı
Go’da sadece koşul yazarak while benzeri bir döngü oluşturabiliriz.
package main
import "fmt"
func main() {
enerji := 3
for enerji > 0 {
fmt.Println("Kod yazılıyor... enerji:", enerji)
enerji--
}
fmt.Println("Mola zamanı!")
}
Bu tarz, koşulun ne zaman bozulacağını dışarıdan kontrol etmek istediğimiz durumlarda okunaklıdır.
range ile koleksiyon gezmek
Diziler, dilimler, map’ler ve string’ler üzerinde dolaşmak için range kullanılır.
package main
import "fmt"
func main() {
diller := []string{"Go", "Python", "Rust"}
for indeks, dil := range diller {
fmt.Println(indeks, dil)
}
}
range, her turda indeks ve değeri verir. Eğer indekse ihtiyacımız yoksa _ ile görmezden gelebiliriz. Bu, Go’nun açık niyetli kod yazma felsefesine uygundur.
break ve continue: döngünün trafik levhaları
break döngüyü tamamen bitirir, continue ise mevcut turu atlayıp sonraki tura geçer.
for i := 1; i <= 10; i++ {
if i == 7 {
break
}
if i%2 == 0 {
continue
}
fmt.Println(i)
}
Bu kod 7’ye gelince durur, çift sayıları ise yazdırmadan geçer. Yani çıktı yalnızca 1, 3 ve 5 olur.
Özetle Go’da akış yönetimi sade ama güçlüdür. if-else programın karar mekanizmasını kurar; for ise tekrar eden işleri tek bir esnek yapı altında toplar. Bu iki aracı iyi kavramak, Go’da okunabilir ve kontrollü programlar yazmanın temelidir.
Yorumlar