Sobes.tech
Middle

Wie überprüft man den Typ einer Variablen in Go zur Laufzeit?

sobes.tech KI

Antwort von AI

In Go kann der Typ einer Variablen zur Laufzeit auf mehrere Arten überprüft werden:

  1. Verwendung von Type Assertion: Geeignet zur Überprüfung eines bestimmten Typs bei einer Schnittstellenvariablen.

    package main
    
    import "fmt"
    
    func main() {
        var i interface{} = "hallo"
    
        s, ok := i.(string) // Versuch, i in den Typ string zu konvertieren
        if ok {
            fmt.Printf("Variable i hat den Typ string: %s\n", s)
        } else {
            fmt.Println("Variable i hat nicht den Typ string")
        }
    }
    
  2. Verwendung von Type Switch: Geeignet zur Überprüfung mehrerer möglicher Typen bei einer Schnittstellenvariablen.

    package main
    
    import "fmt"
    
    func main() {
        var t interface{}
    
        switch tt := t.(type) { // tt hat einen konkreten Typ aus den Fällen
        case int:
            fmt.Printf("Variable hat den Typ int: %d\n", tt)
        case string:
            fmt.Printf("Variable hat den Typ string: %s\n", tt)
        case bool:
            fmt.Printf("Variable hat den Typ bool: %t\n", tt)
        case nil:
            fmt.Println("Variable hat den Wert nil")
        default:
            fmt.Printf("Unbekannter Typ: %T\n", tt) // tt hat den Typ interface{}
        }
    
        t = 123
        switch tt := t.(type) {
        case int:
            fmt.Printf("Variable hat den Typ int: %d\n", tt)
        case string:
            fmt.Printf("Variable hat den Typ string: %s\n", tt)
        case bool:
            fmt.Printf("Variable hat den Typ bool: %t\n", tt)
        case nil:
            fmt.Println("Variable hat den Wert nil")
        default:
            fmt.Printf("Unbekannter Typ: %T\n", tt)
        }
    }
    
  3. Verwendung des Pakets reflect: Ermöglicht das Abrufen von Informationen über den Typ und den Wert der Variablen zur Laufzeit. Wird verwendet, wenn die Typen zur Kompilierungszeit unbekannt sind oder für komplexere Überprüfungen.

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func main() {
        var x float64 = 3.4
        v := reflect.ValueOf(x) // Reflexionswert erhalten
    
        fmt.Println("Typ:", v.Type())                 // Gibt "Typ: float64" aus
        fmt.Println("Kategorie:", v.Kind())             // Gibt "Kategorie: float64" aus
    
        y := "hallo"
        vv := reflect.ValueOf(y)
        fmt.Println("Typ:", vv.Type())               // Gibt "Typ: string" aus
        fmt.Println("Kategorie:", vv.Kind())           // Gibt "Kategorie: string" aus
    
        z := []int{1, 2, 3}
        vvv := reflect.ValueOf(z)
        fmt.Println("Typ:", vvv.Type())             // Gibt "Typ: []int" aus
        fmt.Println("Kategorie:", vvv.Kind())         // Gibt "Kategorie: slice" aus
    }
    

Das Paket reflect ist mächtiger, aber auch komplexer in der Anwendung. Type Assertion und Type Switch sind für einfache Typüberprüfungen bei Schnittstellenvariablen vorzuziehen, da sie sicherer und typorientierter sind.