Go / switch хуваарилагч

switch хуваарилагч

Нэг хувьсагчийг олон боломжит утгатай харьцуулах шаардлагатай үед урт if/else if гинж бичих нь кодыг уншихад хэцүү болгодог. switch хуваарилагч нь энэ асуудлыг цэвэр, тодорхой хэлбэрт шийдэж өгдөг.

switch үндэс

go
package main

import "fmt"

func main() {
    day := "Мягмар"

    switch day {
    case "Даваа":
        fmt.Println("Долоо хоногийн эхний өдөр.")
    case "Мягмар":
        fmt.Println("Долоо хоногийн хоёр дахь өдөр.")
    case "Лхагва":
        fmt.Println("Долоо хоногийн дунд.")
    case "Пүрэв":
        fmt.Println("Долоо хоногийн дөрөв дэх өдөр.")
    case "Баасан":
        fmt.Println("Долоо хоногийн сүүлийн ажлын өдөр!")
    default:
        fmt.Println("Амралтын өдөр.")
    }
}

Гаралт:

код
Долоо хоногийн хоёр дахь өдөр.

Go-ийн switch нь day-ийн утгыг дээрээс доош дараалан шалгана. Таарсан case-ийг ажиллуулаад автоматаар гарна — C, JavaScript шиг break бичих шаардлагагүй. Энэ нь Go-ийн сайхан онцлогуудын нэг.

default блок нь ямар ч case таарахгүй үед ажилладаг — if/else-ийн эцсийн else-тэй адил.

Нэг case дотор олон утга

go
package main

import "fmt"

func main() {
    month := 4

    switch month {
    case 3, 4, 5:
        fmt.Println("Хавар")
    case 6, 7, 8:
        fmt.Println("Зун")
    case 9, 10, 11:
        fmt.Println("Намар")
    case 12, 1, 2:
        fmt.Println("Өвөл")
    default:
        fmt.Println("Буруу сарын дугаар")
    }
}

Гаралт:

код
Хавар

Нэг case дотор таслалаар тусгаарлан олон утга бичиж болно. Аль нэг нь таарвал тэр блок ажиллана.

Нөхцөлтэй switch

switch-д харьцуулах утга өгөхгүйгээр ашиглаж болно — тэгвэл if/else if гинжтэй адил ажилладаг, гэхдээ уншихад хамаагүй тодорхой:

go
package main

import "fmt"

func main() {
    score := 73

    switch {
    case score >= 90:
        fmt.Println("A үнэлгээ")
    case score >= 80:
        fmt.Println("B үнэлгээ")
    case score >= 70:
        fmt.Println("C үнэлгээ")
    case score >= 60:
        fmt.Println("D үнэлгээ")
    default:
        fmt.Println("F үнэлгээ")
    }
}

Гаралт:

код
C үнэлгээ

Энэ хэв маяг нь давхар нөхцөл шалгах, утгын мужийг шалгах зэрэгт маш тохиромжтой.

switch дотор богино зарлал

if-тэй адилаар switch мөрт хувьсагч зарлаж болно:

go
package main

import "fmt"

func getGrade(score int) string {
    switch grade := score / 10; {
    case grade == 10, grade == 9:
        return "A"
    case grade == 8:
        return "B"
    case grade == 7:
        return "C"
    case grade == 6:
        return "D"
    default:
        return "F"
    }
}

func main() {
    fmt.Println(getGrade(95))  // A
    fmt.Println(getGrade(82))  // B
    fmt.Println(getGrade(54))  // F
}

Гаралт:

код
A
B
F

fallthrough

Go-д switch таарсан case-ийн дараа автоматаар зогсдог. Гэхдээ хэрэв дараагийн case-д шилжихийг хүсвэл fallthrough ашиглана:

go
package main

import "fmt"

func main() {
    level := 2

    switch level {
    case 1:
        fmt.Println("Эхлэгч эрх")
        fallthrough
    case 2:
        fmt.Println("Дунд эрх")
        fallthrough
    case 3:
        fmt.Println("Дэвшилтэт эрх")
    case 4:
        fmt.Println("Администратор эрх")
    }
}

Гаралт:

код
Дунд эрх
Дэвшилтэт эрх

level нь 2 тул case 2-оос эхэлнэ. fallthrough байгаа учир case 3 ч ажиллана, харин case 4 ажиллахгүй. fallthrough-г практикт ховор хэрэглэдэг — код уншихад төвөгтэй болгож болзошгүй тул болгоомжтой ашиглах хэрэгтэй.

Төрөл шалгах type switch

Interface-тэй ажиллахад хувьсагчийн жинхэнэ төрлийг шалгах тусгай хэлбэр байдаг:

go
package main

import "fmt"

func describe(value interface{}) {
    switch v := value.(type) {
    case int:
        fmt.Printf("Бүхэл тоо: %d\n", v)
    case string:
        fmt.Printf("Мөр: %q\n", v)
    case bool:
        fmt.Printf("Логик: %t\n", v)
    default:
        fmt.Printf("Тодорхойгүй төрөл: %T\n", v)
    }
}

func main() {
    describe(42)
    describe("Монгол")
    describe(true)
    describe(3.14)
}

Гаралт:

код
Бүхэл тоо: 42
Мөр: "Монгол"
Логик: true
Тодорхойгүй төрөл: float64

Type switch-г interface ба алдаа зохицуулалтын хичээлд дэлгэрэнгүй үзнэ. Одоогоор бүтцийг нь анзаарч байхад хангалттай.

Дараагийн хичээлд:

Go-д давталт хийхдээ зөвхөн for хэрэглэнэ — while эсвэл do/while гэж байхгүй. Гэхдээ for нь маш уян хатан бөгөөд энгийн тоолуур давталтаас эхлэн хязгааргүй давталт хүртэл бүгдийг хийж чадна.