switch хуваарилагч
Нэг хувьсагчийг олон боломжит утгатай харьцуулах шаардлагатай үед урт if/else if гинж бичих нь кодыг уншихад хэцүү болгодог. switch хуваарилагч нь энэ асуудлыг цэвэр, тодорхой хэлбэрт шийдэж өгдөг.
switch үндэс
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 дотор олон утга
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 гинжтэй адил ажилладаг, гэхдээ уншихад хамаагүй тодорхой:
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 мөрт хувьсагч зарлаж болно:
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 ашиглана:
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-тэй ажиллахад хувьсагчийн жинхэнэ төрлийг шалгах тусгай хэлбэр байдаг:
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 нь маш уян хатан бөгөөд энгийн тоолуур давталтаас эхлэн хязгааргүй давталт хүртэл бүгдийг хийж чадна.