Sobes.tech
Middle

Ako skontrolovať typ premennej v Go počas behu?

sobes.tech AI

Odpoveď od AI

V prostredí behu v Go môžete overiť premennú niekoľkými spôsobmi:

  1. Použitím type assertion: Vhodné na overenie konkrétneho typu u rozhrania.

    package main
    
    import "fmt"
    
    func main() {
        var i interface{} = "hello"
    
        s, ok := i.(string) // Pokus o konverziu i na typ string
        if ok {
            fmt.Printf("Premenná i má typ string: %s\n", s)
        } else {
            fmt.Println("Premenná i nemá typ string")
        }
    }
    
  2. Použitím type switch: Vhodné na overenie viacerých možných typov.

    package main
    
    import "fmt"
    
    func main() {
        var t interface{}
    
        switch tt := t.(type) { // tt bude mať konkrétny typ
        case int:
            fmt.Printf("Premenná má typ int: %d\n", tt)
        case string:
            fmt.Printf("Premenná má typ string: %s\n", tt)
        case bool:
            fmt.Printf("Premenná má typ bool: %t\n", tt)
        case nil:
            fmt.Println("Premenná má hodnotu nil")
        default:
            fmt.Printf("Neznámy typ: %T\n", tt) // tt bude mať typ interface{}
        }
    
        t = 123
        switch tt := t.(type) {
        case int:
            fmt.Printf("Premenná má typ int: %d\n", tt)
        case string:
            fmt.Printf("Premenná má typ string: %s\n", tt)
        case bool:
            fmt.Printf("Premenná má typ bool: %t\n", tt)
        case nil:
            fmt.Println("Premenná má hodnotu nil")
        default:
            fmt.Printf("Neznámy typ: %T\n", tt)
        }
    }
    
  3. Použitím balíka reflect: Umožňuje získať informácie o type a hodnote premennej za behu. Používa sa, keď typy nie sú známe pri kompilácii alebo pre zložitejšie kontroly.

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func main() {
        var x float64 = 3.4
        v := reflect.ValueOf(x) // Získanie hodnoty reflexie
    
        fmt.Println("Typ:", v.Type())                 // Vypíše "Typ: float64"
        fmt.Println("Kategória:", v.Kind())             // Vypíše "Kategória: float64"
    
        y := "hello"
        vv := reflect.ValueOf(y)
        fmt.Println("Typ:", vv.Type())               // Vypíše "Typ: string"
        fmt.Println("Kategória:", vv.Kind())           // Vypíše "Kategória: string"
    
        z := []int{1, 2, 3}
        vvv := reflect.ValueOf(z)
        fmt.Println("Typ:", vvv.Type())             // Vypíše "Typ: []int"
        fmt.Println("Kategória:", vvv.Kind())         // Vypíše "Kategória: slice"
    }
    

Balík reflect je mocnejší, ale aj zložitejší na použitie. Type assertion a type switch sú vhodnejšie pre jednoduché kontroly typov rozhraní, pretože sú bezpečnejšie a typovo orientované.