Sobes.tech
Middle

Kako proveriti tip promenljive u Go tokom izvršavanja?

sobes.tech АИ

Одговор од АИ

U okruženju za izvršavanje u Go-u, promenljivu možete proveriti na više načina:

  1. Korišćenjem type assertion: Pogodno za proveru konkretnog tipa u interfejs promenljivoj.

    package main
    
    import "fmt"
    
    func main() {
        var i interface{} = "hello"
    
        s, ok := i.(string) // Pokušaj konverzije i u tip string
        if ok {
            fmt.Printf("Promenljiva i ima tip string: %s\n", s)
        } else {
            fmt.Println("Promenljiva i nema tip string")
        }
    }
    
  2. Korišćenjem type switch: Pogodno za proveru više mogućih tipova.

    package main
    
    import "fmt"
    
    func main() {
        var t interface{}
    
        switch tt := t.(type) { // tt će imati konkretan tip
        case int:
            fmt.Printf("Promenljiva ima tip int: %d\n", tt)
        case string:
            fmt.Printf("Promenljiva ima tip string: %s\n", tt)
        case bool:
            fmt.Printf("Promenljiva ima tip bool: %t\n", tt)
        case nil:
            fmt.Println("Promenljiva ima vrednost nil")
        default:
            fmt.Printf("Nepoznat tip: %T\n", tt) // tt će imati tip interface{}
        }
    
        t = 123
        switch tt := t.(type) {
        case int:
            fmt.Printf("Promenljiva ima tip int: %d\n", tt)
        case string:
            fmt.Printf("Promenljiva ima tip string: %s\n", tt)
        case bool:
            fmt.Printf("Promenljiva ima tip bool: %t\n", tt)
        case nil:
            fmt.Println("Promenljiva ima vrednost nil")
        default:
            fmt.Printf("Nepoznat tip: %T\n", tt)
        }
    }
    
  3. Korišćenjem paketa reflect: Omogućava dobijanje informacija o tipu i vrednosti promenljive u toku izvršavanja. Koristi se kada tipovi nisu poznati tokom kompilacije ili za složenije provere.

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func main() {
        var x float64 = 3.4
        v := reflect.ValueOf(x) // Dobijanje vrednosti refleksije
    
        fmt.Println("Tip:", v.Type())                 // Ispisuje "Tip: float64"
        fmt.Println("Kategorija:", v.Kind())             // Ispisuje "Kategorija: float64"
    
        y := "hello"
        vv := reflect.ValueOf(y)
        fmt.Println("Tip:", vv.Type())               // Ispisuje "Tip: string"
        fmt.Println("Kategorija:", vv.Kind())           // Ispisuje "Kategorija: string"
    
        z := []int{1, 2, 3}
        vvv := reflect.ValueOf(z)
        fmt.Println("Tip:", vvv.Type())             // Ispisuje "Tip: []int"
        fmt.Println("Kategorija:", vvv.Kind())         // Ispisuje "Kategorija: slice"
    }
    

Paket reflect je moćniji, ali i složeniji za korišćenje. Type assertion i type switch su preporučeni za jednostavne provere tipova interfejs promenljivih, jer su sigurniji i tip-oreijentirani.