Darsliklar Go Lang Switch

Go Lang Go Lang Switch

Switch — bitta qiymatni bir nechta variant bilan ketma-ket solishtirish uchun ishlatiladigan boshqaruv tuzilmasi. Go’ning switchi C++ yoki Java’dan tubdan farq qiladigan bitta muhim xususiyatga ega: u avtomatik “quyiga tushmaydi” (no fallthrough).

switch / casebitta ifodani bir nechta case sharti bilan solishtiradigan tuzilma. Go’da mos case topilgach, boshqa caselarga o’tilmasdan switch avtomatik tugaydi.

Fallthrough — yo’q, sukut bo’yicha

C++ yoki Java’da har bir casedan keyin break yozish shart, aks holda ijro keyingi casega “sizib o’tadi”. Go’da bu teskarisibreak shart emas, chunki fallthrough sukut bo’yicha o’chirilgan:

package main

import "fmt"

func main() {
    son := 2
    switch son {
    case 1:
        fmt.Println("bitta")
    case 2:
        fmt.Println("ikki")
    case 3:
        fmt.Println("uch")
    }
}
ikki

Faqat mos kelgan case 2: bajarildi, qolganlariga umuman tegilmadi — hech qanday break yozmasdan ham. Bu Go dizaynerlarining ataylab qilgan qarori: C’dagi tasodifiy fallthrough xatolarining oldini olish.

fallthrough kalit so’zi — qo’lda yoqish

Ba’zan keyingi casega ataylab o’tish kerak bo’ladi — bu uchun fallthrough kalit so’zi ishlatiladi:

package main

import "fmt"

func main() {
    son := 1
    switch son {
    case 1:
        fmt.Println("bitta")
        fallthrough
    case 2:
        fmt.Println("ikki (fallthrough orqali)")
    case 3:
        fmt.Println("uch")
    }
}
bitta
ikki (fallthrough orqali)

fallthroughcase 1: blokining oxirida yozilgani uchun ijro majburan case 2:ga o’tdi (shartini tekshirmasdan). case 3: esa fallthrough yozilmagani uchun ishga tushmadi.

Shartsiz switch — if…elsif zanjiriga muqobil

switch qiymatsiz, faqat mantiqiy shartlar bilan ham yozilishi mumkin — bu uzun if...else if zanjirini toza ko’rinishga keltiradi:

package main

import "fmt"

func main() {
    harorat := 5

    switch {
    case harorat < 0:
        fmt.Println("muzlash")
    case harorat < 15:
        fmt.Println("sovuq")
    case harorat < 25:
        fmt.Println("salqin")
    default:
        fmt.Println("issiq")
    }
}
sovuq

switch { — qiymatsiz yozildi, har bir case esa mustaqil bool ifoda. Birinchi rost topilgan case ishladi.

switch bilan init-statement

if kabi, switch ham nuqta-vergulgacha bo’lgan qisqa boshlang’ich buyruqni qabul qiladi:

package main

import "fmt"

func kunNomi(raqam int) string {
    switch raqam {
    case 1:
        return "Dushanba"
    case 2:
        return "Seshanba"
    default:
        return "Boshqa"
    }
}

func main() {
    switch kun := kunNomi(2); kun {
    case "Dushanba":
        fmt.Println("Hafta boshi")
    case "Seshanba":
        fmt.Println("Hafta davomi:", kun)
    default:
        fmt.Println("Noma'lum")
    }
}
Hafta davomi: Seshanba

kun := kunNomi(2) avval hisoblandi, so’ng shu natija asosida solishtirildi — kun o’zgaruvchisi esa switch blokining o’zida, caselar ichida ham ishlatilaveradi.