if,else ifvə qısa ifadəliifyazmaqfor-un klassik, şərtli, sonsuz vərangeformalarından istifadə etməkswitch,fallthroughvə nişanlıbreakilə 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.
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)
}
}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.
| Forma | Nümunə | Başqa dillərdə |
|---|---|---|
| Klassik | for i := 0; i < 5; i++ { } | C və Java-dakı for |
| Yalnız şərt | for n < 100 { } | while |
| Sonsuz | for { ... 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) |
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))
}
}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.
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")
}
}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.
if score >= 90 {
grade = "A"
} else if score >= 75 {
grade = "B"
} else if score >= 50 {
grade = "C"
} else {
grade = "F"
}switch {
case score >= 90:
grade = "A"
case score >= 75:
grade = "B"
case score >= 50:
grade = "C"
default:
grade = "F"
}switch daha səliqəli oxunur. case-lər yuxarıdan aşağı yoxlanılır və ilk doğru şərt qalib gəlir.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")
}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.forGo-nun yeganə dövrüdür: klassik, yalnız şərtli, sonsuz vərangeformaları var.rangesətirdə simvollarla gəzir və baytın indeksini verir;for i := range nGo 1.22-dən işləyir.switch-dəbreakyazılmır; bircase-də bir neçə qiymət ola bilər, ifadəsizswitchisəif-elsezəncirini əvəz edir.- Dövrün içindəki
switch-dən bütün dövrü dayandırmaq üçün nişanlıbreaklazımdır.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.
while dövrünü necə yazmaq olar?