Sobes.tech
Middle

Kaip patikrinti kintamojo tipą Go kalboje vykdymo metu?

sobes.tech AI

Atsakymas iš AI

Go vykdymo aplinkoje galima patikrinti kintamąjį keliais būdais:

  1. Naudojant type assertion: Tinka tikrinant konkretų tipą interfeiso kintamajame.

    package main
    
    import "fmt"
    
    func main() {
        var i interface{} = "hello"
    
        s, ok := i.(string) // bandymas konvertuoti i į string tipą
        if ok {
            fmt.Printf("Kintamasis i turi string tipą: %s\n", s)
        } else {
            fmt.Println("Kintamasis i neturi string tipo")
        }
    }
    
  2. Naudojant type switch: Tinka kelių galimų tipų patikrinimui.

    package main
    
    import "fmt"
    
    func main() {
        var t interface{}
    
        switch tt := t.(type) { // tt turės konkretų tipą
        case int:
            fmt.Printf("Kintamasis turi int tipą: %d\n", tt)
        case string:
            fmt.Printf("Kintamasis turi string tipą: %s\n", tt)
        case bool:
            fmt.Printf("Kintamasis turi bool tipą: %t\n", tt)
        case nil:
            fmt.Println("Kintamasis turi nil reikšmę")
        default:
            fmt.Printf("Nežinomas tipas: %T\n", tt) // tt turės interface{} tipą
        }
    
        t = 123
        switch tt := t.(type) {
        case int:
            fmt.Printf("Kintamasis turi int tipą: %d\n", tt)
        case string:
            fmt.Printf("Kintamasis turi string tipą: %s\n", tt)
        case bool:
            fmt.Printf("Kintamasis turi bool tipą: %t\n", tt)
        case nil:
            fmt.Println("Kintamasis turi nil reikšmę")
        default:
            fmt.Printf("Nežinomas tipas: %T\n", tt)
        }
    }
    
  3. Naudojant reflect paketą: Leidžia gauti informacijos apie tipo ir reikšmės duomenis vykdymo metu. Naudojama, kai tipai nėra žinomi kompiliacijos metu arba sudėtingesnėms patikroms.

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func main() {
        var x float64 = 3.4
        v := reflect.ValueOf(x) // gauti refleksijos reikšmę
    
        fmt.Println("Tipas:", v.Type())                 // Spausdins "Tipas: float64"
        fmt.Println("Kategorija:", v.Kind())             // Spausdins "Kategorija: float64"
    
        y := "hello"
        vv := reflect.ValueOf(y)
        fmt.Println("Tipas:", vv.Type())               // Spausdins "Tipas: string"
        fmt.Println("Kategorija:", vv.Kind())           // Spausdins "Kategorija: string"
    
        z := []int{1, 2, 3}
        vvv := reflect.ValueOf(z)
        fmt.Println("Tipas:", vvv.Type())             // Spausdins "Tipas: []int"
        fmt.Println("Kategorija:", vvv.Kind())         // Spausdins "Kategorija: slice"
    }
    

reflect paketas yra galingesnis, bet sudėtingesnis naudoti. Type assertion ir type switch yra tinkamesni paprastoms tipų patikroms, nes jie yra saugesni ir tipų orientuoti.