Sobes.tech
Middle

Πώς ελέγχετε τον τύπο μιας μεταβλητής σε Go κατά τη διάρκεια εκτέλεσης;

sobes.tech AI

Απάντηση από AI

Στη Go, ο τύπος μιας μεταβλητής κατά την εκτέλεση μπορεί να ελεγχθεί με διάφορους τρόπους:

  1. Χρησιμοποιώντας την assertion τύπου: Κατάλληλο για τον έλεγχο ενός συγκεκριμένου τύπου σε μια μεταβλητή διεπαφής.

    package main
    
    import "fmt"
    
    func main() {
        var i interface{} = "γεια"
    
        s, ok := i.(string) // Προσπάθεια μετατροπής του i σε τύπο string
        if ok {
            fmt.Printf("Η μεταβλητή i έχει τύπο string: %s\n", s)
        } else {
            fmt.Println("Η μεταβλητή i δεν έχει τύπο string")
        }
    }
    
  2. Χρησιμοποιώντας switch τύπου: Κατάλληλο για τον έλεγχο πολλαπλών πιθανών τύπων σε μια μεταβλητή διεπαφής.

    package main
    
    import "fmt"
    
    func main() {
        var t interface{}
    
        switch tt := t.(type) { // tt θα έχει συγκεκριμένο τύπο από τις περιπτώσεις
        case int:
            fmt.Printf("Η μεταβλητή έχει τύπο int: %d\n", tt)
        case string:
            fmt.Printf("Η μεταβλητή έχει τύπο string: %s\n", tt)
        case bool:
            fmt.Printf("Η μεταβλητή έχει τύπο bool: %t\n", tt)
        case nil:
            fmt.Println("Η μεταβλητή έχει τιμή nil")
        default:
            fmt.Printf("Άγνωστος τύπος: %T\n", tt) // tt θα έχει τύπο interface{}
        }
    
        t = 123
        switch tt := t.(type) {
        case int:
            fmt.Printf("Η μεταβλητή έχει τύπο int: %d\n", tt)
        case string:
            fmt.Printf("Η μεταβλητή έχει τύπο string: %s\n", tt)
        case bool:
            fmt.Printf("Η μεταβλητή έχει τύπο bool: %t\n", tt)
        case nil:
            fmt.Println("Η μεταβλητή έχει τιμή nil")
        default:
            fmt.Printf("Άγνωστος τύπος: %T\n", tt)
        }
    }
    
  3. Χρησιμοποιώντας το πακέτο reflect: Επιτρέπει την απόκτηση πληροφοριών σχετικά με τον τύπο και την τιμή της μεταβλητής κατά την εκτέλεση. Χρησιμοποιείται όταν οι τύποι δεν είναι γνωστοί κατά τη μεταγλώττιση ή για πιο πολύπλοκες ελέγχους.

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func main() {
        var x float64 = 3.4
        v := reflect.ValueOf(x) // Λαμβάνουμε την τιμή ανακλάσεων
    
        fmt.Println("Τύπος:", v.Type())                 // Εμφανίζει "Τύπος: float64"
        fmt.Println("Κατηγορία:", v.Kind())             // Εμφανίζει "Κατηγορία: float64"
    
        y := "γεια"
        vv := reflect.ValueOf(y)
        fmt.Println("Τύπος:", vv.Type())               // Εμφανίζει "Τύπος: string"
        fmt.Println("Κατηγορία:", vv.Kind())           // Εμφανίζει "Κατηγορία: string"
    
        z := []int{1, 2, 3}
        vvv := reflect.ValueOf(z)
        fmt.Println("Τύπος:", vvv.Type())             // Εμφανίζει "Τύπος: []int"
        fmt.Println("Κατηγορία:", vvv.Kind())         // Εμφανίζει "Κατηγορία: slice"
    }
    

Το πακέτο reflect είναι πιο ισχυρό, αλλά και πιο πολύπλοκο στη χρήση. Η assertion τύπου και το switch τύπου προτιμώνται για απλούς ελέγχους τύπων σε μεταβλητές διεπαφής, καθώς είναι πιο ασφαλείς και προσανατολισμένοι στον τύπο.