Go tilida o'zgaruvchining turini bajarilish vaqtida qanday tekshirish mumkin?
sobes.tech AI
AIdan javob
Go'da, bajarilayotgan muhitda o'zgaruvchining turi bir nechta usul bilan tekshirilishi mumkin:
-
Type assertion (turi tasdiqlash) dan foydalanish: Bu, interfeys o'zgaruvchisining aniq turini tekshirish uchun mos keladi.
package main import "fmt" func main() { var i interface{} = "salom" s, ok := i.(string) // i ni string turiga o'tkazishga urinish if ok { fmt.Printf("O'zgaruvchi i ning turi string: %s\n", s) } else { fmt.Println("O'zgaruvchi i ning turi string emas") } } -
Type switch (turi bo'yicha switch) dan foydalanish: Bu, interfeys o'zgaruvchisining bir nechta mumkin bo'lgan turini tekshirish uchun mos keladi.
package main import "fmt" func main() { var t interface{} switch tt := t.(type) { // tt, aniq turga ega bo'ladi case int: fmt.Printf("O'zgaruvchi turi int: %d\n", tt) case string: fmt.Printf("O'zgaruvchi turi string: %s\n", tt) case bool: fmt.Printf("O'zgaruvchi turi bool: %t\n", tt) case nil: fmt.Println("O'zgaruvchi qiymati nil") default: fmt.Printf("Noma'lum tur: %T\n", tt) // tt, interface{} turida } t = 123 switch tt := t.(type) { case int: fmt.Printf("O'zgaruvchi turi int: %d\n", tt) case string: fmt.Printf("O'zgaruvchi turi string: %s\n", tt) case bool: fmt.Printf("O'zgaruvchi turi bool: %t\n", tt) case nil: fmt.Println("O'zgaruvchi qiymati nil") default: fmt.Printf("Noma'lum tur: %T\n", tt) } } -
reflect paketidan foydalanish: Bu, o'zgaruvchining turini va qiymatini bajarilayotgan vaqtda olish imkonini beradi. Bu, turlar kompilatsiya vaqtida noma'lum bo'lsa yoki murakkab tekshiruvlar uchun ishlatiladi.
package main import ( "fmt" "reflect" ) func main() { var x float64 = 3.4 v := reflect.ValueOf(x) // Refleksiya qiymatini olish fmt.Println("Tur:", v.Type()) // "Tur: float64" ni chiqaradi fmt.Println("Kategoriya:", v.Kind()) // "Kategoriya: float64" ni chiqaradi y := "salom" vv := reflect.ValueOf(y) fmt.Println("Tur:", vv.Type()) // "Tur: string" ni chiqaradi fmt.Println("Kategoriya:", vv.Kind()) // "Kategoriya: string" ni chiqaradi z := []int{1, 2, 3} vvv := reflect.ValueOf(z) fmt.Println("Tur:", vvv.Type()) // "Tur: []int" ni chiqaradi fmt.Println("Kategoriya:", vvv.Kind()) // "Kategoriya: slice" ni chiqaradi }
reflect paketi, kuchliroq, ammo foydalanish uchun murakkabroq. Type assertion va type switch, oddiy interfeys o'zgaruvchilari uchun, ular xavfsizroq va turga yo'naltirilgan bo'lgani uchun, afzalroq.