Sobes.tech
Middle

Go-da işləmə zamanı dəyişənin növünü necə yoxlamaq olar?

sobes.tech Süni İntellekt

AI-dan cavab

Go-da, icra zamanı dəyişənin tipi müxtəlif üsullarla yoxlana bilər:

  1. Tip assertion istifadə edərək: Bu, interfeys dəyişənində müəyyən bir tipi yoxlamaq üçün uyğundur.

    package main
    
    import "fmt"
    
    func main() {
        var i interface{} = "salam"
    
        s, ok := i.(string) // i-ni string tipinə çevirməyə cəhd
        if ok {
            fmt.Printf("Dəyişən i-nin tipi stringdir: %s\n", s)
        } else {
            fmt.Println("Dəyişən i-nin tipi string deyil")
        }
    }
    
  2. Tip switch istifadə edərək: Bu, interfeys dəyişənində bir neçə mümkün tipi yoxlamaq üçün uyğundur.

    package main
    
    import "fmt"
    
    func main() {
        var t interface{}
    
        switch tt := t.(type) { // tt, konkret bir tipe sahib olacaq
        case int:
            fmt.Printf("Dəyişən int tipindədir: %d\n", tt)
        case string:
            fmt.Printf("Dəyişən string tipindədir: %s\n", tt)
        case bool:
            fmt.Printf("Dəyişən bool tipindədir: %t\n", tt)
        case nil:
            fmt.Println("Dəyişənin dəyəri nil")
        default:
            fmt.Printf("Naməlum tip: %T\n", tt) // tt, interface{} tipində olacaq
        }
    
        t = 123
        switch tt := t.(type) {
        case int:
            fmt.Printf("Dəyişən int tipindədir: %d\n", tt)
        case string:
            fmt.Printf("Dəyişən string tipindədir: %s\n", tt)
        case bool:
            fmt.Printf("Dəyişən bool tipindədir: %t\n", tt)
        case nil:
            fmt.Println("Dəyişənin dəyəri nil")
        default:
            fmt.Printf("Naməlum tip: %T\n", tt)
        }
    }
    
  3. reflect paketindən istifadə: Bu, dəyişənin tipi və dəyəri haqqında məlumat almağa imkan verir. Bu, tiplər tərtib zamanı məlum deyilsə və ya daha mürəkkəb yoxlamalar üçün istifadə olunur.

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func main() {
        var x float64 = 3.4
        v := reflect.ValueOf(x) // Refleksiya dəyərini əldə et
    
        fmt.Println("Tip:", v.Type())                 // "Tip: float64" göstərir
        fmt.Println("Kateqoriya:", v.Kind())             // "Kateqoriya: float64" göstərir
    
        y := "salam"
        vv := reflect.ValueOf(y)
        fmt.Println("Tip:", vv.Type())               // "Tip: string" göstərir
        fmt.Println("Kateqoriya:", vv.Kind())           // "Kateqoriya: string" göstərir
    
        z := []int{1, 2, 3}
        vvv := reflect.ValueOf(z)
        fmt.Println("Tip:", vvv.Type())             // "Tip: []int" göstərir
        fmt.Println("Kateqoriya:", vvv.Kind())         // "Kateqoriya: slice" göstərir
    }
    

reflect paketi daha güclüdür, amma istifadə üçün daha mürəkkəbdir. Tip assertion və tip switch, sadə interfeys dəyişənlərinin tip yoxlamaları üçün üstünlük təşkil edir, çünki onlar daha təhlükəsiz və tiplərə yönəlib.