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:
-
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") } } -
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) } } -
Naudojant
reflectpaketą: 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.