Sobes.tech
Middle

Kā pārbaudīt mainīgā tipu Go valodā izpildes laikā?

sobes.tech AI

Atbilde no AI

Runas vidē ir Go izpildes laikā var pārbaudīt mainīgo vairākos veidos:

  1. Izmantojot type assertion: Piemērots konkrēta tipa pārbaude interfeisa mainīgajā.

    package main
    
    import "fmt"
    
    func main() {
        var i interface{} = "hello"
    
        s, ok := i.(string) // mēģinājums pārveidot i uz string tipu
        if ok {
            fmt.Printf("Mainīgais i ir string tips: %s\n", s)
        } else {
            fmt.Println("Mainīgais i nav string tips")
        }
    }
    
  2. Izmantojot type switch: Piemērots vairāku iespējamā tipu pārbaudei.

    package main
    
    import "fmt"
    
    func main() {
        var t interface{}
    
        switch tt := t.(type) { // tt būs konkrēts tips
        case int:
            fmt.Printf("Mainīgais ir int tips: %d\n", tt)
        case string:
            fmt.Printf("Mainīgais ir string tips: %s\n", tt)
        case bool:
            fmt.Printf("Mainīgais ir bool tips: %t\n", tt)
        case nil:
            fmt.Println("Mainīgais ir nil vērtība")
        default:
            fmt.Printf("Nezināms tips: %T\n", tt) // tt būs interface{} tips
        }
    
        t = 123
        switch tt := t.(type) {
        case int:
            fmt.Printf("Mainīgais ir int tips: %d\n", tt)
        case string:
            fmt.Printf("Mainīgais ir string tips: %s\n", tt)
        case bool:
            fmt.Printf("Mainīgais ir bool tips: %t\n", tt)
        case nil:
            fmt.Println("Mainīgais ir nil vērtība")
        default:
            fmt.Printf("Nezināms tips: %T\n", tt)
        }
    }
    
  3. Izmantojot reflect paketi: Tas ļauj iegūt informāciju par mainīgā tipu un vērtību izpildes laikā. To izmanto, ja tipi nav zināmi kompilācijas laikā vai nepieciešamas sarežģītākas pārbaudes.

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func main() {
        var x float64 = 3.4
        v := reflect.ValueOf(x) // iegūt refleksijas vērtību
    
        fmt.Println("Tips:", v.Type())                 // Izvadīs "Tips: float64"
        fmt.Println("Kategorija:", v.Kind())             // Izvadīs "Kategorija: float64"
    
        y := "hello"
        vv := reflect.ValueOf(y)
        fmt.Println("Tips:", vv.Type())               // Izvadīs "Tips: string"
        fmt.Println("Kategorija:", vv.Kind())           // Izvadīs "Kategorija: string"
    
        z := []int{1, 2, 3}
        vvv := reflect.ValueOf(z)
        fmt.Println("Tips:", vvv.Type())             // Izvadīs "Tips: []int"
        fmt.Println("Kategorija:", vvv.Kind())         // Izvadīs "Kategorija: slice"
    }
    

reflect pakete ir spēcīgāks, bet arī sarežģītāks lietošanā. Type assertion un type switch ir piemērotāki vienkāršām tipu pārbaudēm interfeisa mainīgajiem, jo tie ir drošāki un tipu orientēti.