Sobes.tech
Middle

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:

  1. 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")
        }
    }
    
  2. 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)
        }
    }
    
  3. 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.