Məzmuna keç
Educora
Başlanğıc14 dəq3 / 10

Şərtlər, dövrlər və switch

`if` və qısa ifadə ilə qərar ver, Go-nun yeganə dövrü olan `for`-un bütün formalarını və `break` yazılmayan `switch`-i öyrən.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • if, else if və qısa ifadəli if yazmaq
  • for-un klassik, şərtli, sonsuz və range formalarından istifadə etmək
  • switch, fallthrough və nişanlı break ilə işləmək

Hava tətbiqi temperatura baxıb «isti» və ya «soyuq» yazır, oyun isə oyunçu qalib gələnə qədər eyni addımları təkrarlayır. Proqramın qərar verməsi və işi təkrarlaması üçün şərtlər və dövrlər lazımdır. Go-da bunun üçün cəmi üç alət var: if, for və switch — və onların hər biri sadə olduğu qədər də güclüdür.

if, else və qısa ifadə

Go-da şərt mötərizəyə alınmır, fiqurlu mötərizələr isə hətta bir sətirlik blokda da məcburidir. else if ilə istənilən sayda şərt yoxlamaq olar. Xüsusi imkan: şərtdən əvvəl nöqtəli vergüllə qısa ifadə yazmaq olar, məsələn, if n, err := strconv.Atoi(s); err == nil. Bu ifadədə yaradılan dəyişənlər yalnız if və else bloklarının içində görünür.

Go
package main

import (
	"fmt"
	"strconv"
)

func main() {
	temperature := 28
	if temperature > 30 {
		fmt.Println("Hot")
	} else if temperature > 20 {
		fmt.Println("Warm")
	} else {
		fmt.Println("Cold")
	}

	if n, err := strconv.Atoi("17"); err == nil {
		fmt.Println("double:", n*2)
	}
	if _, err := strconv.Atoi("abc"); err != nil {
		fmt.Println("error:", err)
	}
}
Gözlənilən nəticə
Warm
double: 34
error: strconv.Atoi: parsing "abc": invalid syntax

Şərtlərdə müqayisə operatorları (==, !=, <, >, <=, >=) və məntiqi operatorlar işlədilir: && (və), || (və ya), ! (inkar). Go-da şərt mütləq bool olmalıdır: C-dəki kimi if n yazmaq olmur, if n != 0 yazmaq lazımdır.

for — yeganə dövr

Go-da while və do-while yoxdur: bütün dövrlər for ilə yazılır. Lakin for-un bir neçə forması var və o, başqa dillərdəki bütün dövrləri əvəz edir. break dövrü dayandırır, continue isə cari addımın qalanını buraxıb növbəti addıma keçir.

FormaNümunəBaşqa dillərdə
Klassikfor i := 0; i < 5; i++ { }C və Java-dakı for
Yalnız şərtfor n < 100 { }while
Sonsuzfor { ... break }while (true)
range iləfor i, v := range items { }for-each
Ədəd üzrə (Go 1.22+)for i := range 5 { }Python-da range(5)
Go
package main

import "fmt"

func main() {
	for i := 1; i <= 3; i++ {
		fmt.Println("step", i)
	}

	n := 1
	for n < 100 {
		n *= 3
	}
	fmt.Println("n =", n)

	for i := range 5 {
		if i%2 == 0 {
			continue
		}
		fmt.Println("odd:", i)
	}

	for i, r := range "Gəncə" {
		fmt.Println(i, string(r))
	}
}
Gözlənilən nəticə
step 1
step 2
step 3
n = 243
odd: 1
odd: 3
0 G
1 ə
3 n
4 c
5 ə

Şərtli dövr n 100-ü keçənə qədər onu 3-ə vurur: 1 → 3 → 9 → 27 → 81 → 243. Son dövrə diqqət et: range sətirdə baytlarla yox, simvollarla (rune-larla) gəzir, i isə simvolun başladığı baytın indeksidir. ə iki bayt tutduğu üçün indeks 1-dən birbaşa 3-ə keçir. İndeks lazım deyilsə, onun yerinə _ yaz: for _, r := range s.

switch

switch bir qiyməti bir neçə variantla müqayisə edir. Java və C-dən fərqli olaraq, Go-da hər case-in sonunda break yazmaq lazım deyil: uyğun gələn blok icra olunur və switch bitir. Bir case-də bir neçə qiyməti vergüllə sadalamaq olar. İfadəsiz switch isə uzun if-else zəncirini əvəz edir: hər case-də ayrıca şərt yazılır.

Go
package main

import "fmt"

func main() {
	day := "Saturday"
	switch day {
	case "Saturday", "Sunday":
		fmt.Println("Weekend")
	default:
		fmt.Println("Weekday")
	}

	score := 83
	switch {
	case score >= 90:
		fmt.Println("Excellent")
	case score >= 75:
		fmt.Println("Good")
	default:
		fmt.Println("Keep going")
	}

	switch n := 2; n {
	case 2:
		fmt.Println("two")
		fallthrough
	case 3:
		fmt.Println("three")
	case 4:
		fmt.Println("four")
	}
}
Gözlənilən nəticə
Weekend
Good
two
three

switch də if kimi qısa ifadə qəbul edir: switch n := 2; n. fallthrough açar sözü isə şərti yoxlamadan növbəti case-in blokunu da icra edir, ona görə nümunədə two-dan sonra three də çap olundu. Real kodda ona çox nadir ehtiyac olur.

Uzun if-else zənciri
if score >= 90 {
	grade = "A"
} else if score >= 75 {
	grade = "B"
} else if score >= 50 {
	grade = "C"
} else {
	grade = "F"
}
İfadəsiz switch
switch {
case score >= 90:
	grade = "A"
case score >= 75:
	grade = "B"
case score >= 50:
	grade = "C"
default:
	grade = "F"
}
Hər iki variant eyni işi görür, amma şərtlər çox olanda switch daha səliqəli oxunur. case-lər yuxarıdan aşağı yoxlanılır və ilk doğru şərt qalib gəlir.
Go
package main

import "fmt"

func main() {
	commands := []string{"move", "jump", "stop", "move"}
loop:
	for _, c := range commands {
		switch c {
		case "stop":
			break loop
		default:
			fmt.Println("doing", c)
		}
	}
	fmt.Println("finished")
}
Gözlənilən nəticə
doing move
doing jump
finished
[]string{...} sətirlər dilimidir (siyahısıdır); dilimləri ayrıca dərsdə öyrənəcəksən.

Əsas fikirlər

  • if-də şərt mötərizəsiz yazılır, {} isə məcburidir; qısa ifadə (if x := f(); x > 0) dəyişəni blokla məhdudlaşdırır.
  • for Go-nun yeganə dövrüdür: klassik, yalnız şərtli, sonsuz və range formaları var.
  • range sətirdə simvollarla gəzir və baytın indeksini verir; for i := range n Go 1.22-dən işləyir.
  • switch-də break yazılmır; bir case-də bir neçə qiymət ola bilər, ifadəsiz switch isə if-else zəncirini əvəz edir.
  • Dövrün içindəki switch-dən bütün dövrü dayandırmaq üçün nişanlı break lazımdır.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
Go-da başqa dillərdəki while dövrünü necə yazmaq olar?