Skip to content

Latest commit

 

History

History
248 lines (189 loc) · 4.07 KB

01-dongu.md

File metadata and controls

248 lines (189 loc) · 4.07 KB

Bölüm 07/01: Döngüler

Döngü ve iterasyon işleri için go’da tek bir komut var o da for. Diğer dillerdeki gibi Do - While gibi şeyler yok. Otomatik olarak tekrar edilecek şeyler için for döngüsü kullanırız.


C-Style

JavaScript ile uğraşanların yakından tanıdığı, C’deki döngü yapısı go’da da var, buna explicit control (açık, belirgin) denir:

// i sadece {} içinde yaşar, kapsam (scope)
for i := 0; i < 10; i++ {
   // yapılacak işler
}

Üç aşamalı işlem;

  1. initialize; i := 0
  2. check; i < 10
  3. augmentation; i++ (arttır, ya da eksilt)

range

Önceki bölümlerde de görmüştük, range neredeyse en çok kullanacağımız döngü şeklidir. Bu stile implicit control (dahili, gizli) denir. Ranging over yani nelerin içinde bu iterasyonları yapabiliriz?

  • Koleksiyonlar; (Array, Slice, String)
  • map
  • Channel

Örneğe bakalım, index, index + value, blank identifer+value kullanımları:

https://go.dev/play/p/BvDqmQzoECi

package main

import "fmt"

func main() {
	users := []string{"vigo", "lego", "turbo"} // slice

	// ilk değer her zaman slice'ın index'i
	for i := range users {
		fmt.Println("index", i)
	}
	// index 0
	// index 1
	// index 2

	// index, element durumu;
	// ilk değer her zaman slice'ın index'i
	// diğer değer koleksiyondaki element'in o index'deki değeri
	for i, user := range users {
		fmt.Println(i, user)
	}
	// 0 vigo
	// 1 lego
	// 2 turbo

	// blank identifer kullanımı, ilk değeri yutuyoruz
	// diğer değer koleksiyondaki element'in o index'deki değeri
	for _, user := range users {
		fmt.Println(user)
	}
	// vigo
	// lego
	// turbo
}

_ blank identifier ile değeri yutuyoruz, bunu compile time’de görme, kullanma diyoruz. Keza _ için untyped, reusable variable placeholder da denir.

map konusunda değinmiştik; map’de de range iterasyon yapıyoruz:

https://go.dev/play/p/kgj16srGhGx

package main

import "fmt"

func main() {
	users := map[string]string{
		"vigo":  "user",
		"turbo": "admin",
		"lego":  "superadmin",
	}

	// ilk değer key
	for user := range users {
		fmt.Println(user, users[user])
		// key, value
	}
	// vigo user
	// turbo admin
	// lego superadmin

	// ilk değer key
	// sonraki değer value
	for user, level := range users {
		fmt.Println(user, level)
	}
	// vigo user
	// turbo admin
	// lego superadmin
}

Sonsuz döngü için;

// kontrol durumu yok (omit the condition) ~ while (true) durumu
for {
	// yapılacak iş
}

break ve continue

Döngüyü kırıp çıkmak için break kullanırız, Do-While bezeri bir döngü;

https://go.dev/play/p/MyM4CYviApA

package main

import "fmt"

func main() {
	i := 0
	for {
		fmt.Println("i", i)
		i++
		if i > 5 {
			break
		}
	}
	fmt.Println("i'nin son değeri", i)
	// i for-loop'dan önce initialize edildiği için
	// bu noktada erişilebilir...
}

// i 0
// i 1
// i 2
// i 3
// i 4
// i 5
// i'nin son değeri 6

Döngü esnasında belli durumları pas geçmek için, bir sonraki iterasyona geçmek için continue kullanırız:

https://go.dev/play/p/y3DkERb_t-n

package main

import "fmt"

func main() {
	for i := 0; i < 4; i++ {
		// eğer i 2'ye eşitse sonraki iterasyona geç
		if i == 2 {
			continue
		}
		fmt.Println(i)
	}
}
// 0
// 1
// 3

for ve Koşul

for tanımı yaparken koşul da verebiliriz:

https://go.dev/play/p/cDFY7r5b2rA

package main

import "fmt"

func main() {
	sum := 1

	// bu döngü, sum 6'dan küçük olduğu sürece çalışır
	for sum < 6 {
		fmt.Println(sum)
		sum += sum
	}
	fmt.Println(sum)
}
// 1
// 2 (1+1)
// 4 (2+2)
// 8 (4+4)

Label Kullanımı

Aynı switch, case’de olduğu gibi, belli bir durum/koşulda çıkış yapacağımız yeri gösterebiliriz:

https://go.dev/play/p/hUziRABXmit

package main

import "fmt"

func main() {
outer: // label, en dış katman
	for i := 0; i < 10; i++ {
		for j := 0; j < 3; j++ {
			fmt.Println(i, j)
			if j == 2 {
				break outer // loop'tan komple çık
			}
		}
	}
}

// 0 0
// 0 1
// 0 2