Sobes.tech
Middle

Hoe controleer je het type van een variabele in Go tijdens runtime?

sobes.tech AI

Antwoord van AI

In Go kan het type van een variabele tijdens runtime op verschillende manieren worden gecontroleerd:

  1. Gebruik maken van type assertion: Geschikt voor het controleren van een specifiek type op een interface-variabele.

    package main
    
    import "fmt"
    
    func main() {
        var i interface{} = "hallo"
    
        s, ok := i.(string) // Poging om i te converteren naar string
        if ok {
            fmt.Printf("Variabele i heeft type string: %s\n", s)
        } else {
            fmt.Println("Variabele i heeft niet het type string")
        }
    }
    
  2. Gebruik maken van type switch: Geschikt voor het controleren van meerdere mogelijke types op een interface-variabele.

    package main
    
    import "fmt"
    
    func main() {
        var t interface{}
    
        switch tt := t.(type) { // tt krijgt een concreet type uit de cases
        case int:
            fmt.Printf("Variabele heeft type int: %d\n", tt)
        case string:
            fmt.Printf("Variabele heeft type string: %s\n", tt)
        case bool:
            fmt.Printf("Variabele heeft type bool: %t\n", tt)
        case nil:
            fmt.Println("Variabele heeft waarde nil")
        default:
            fmt.Printf("Onbekend type: %T\n", tt) // tt krijgt type interface{}
        }
    
        t = 123
        switch tt := t.(type) {
        case int:
            fmt.Printf("Variabele heeft type int: %d\n", tt)
        case string:
            fmt.Printf("Variabele heeft type string: %s\n", tt)
        case bool:
            fmt.Printf("Variabele heeft type bool: %t\n", tt)
        case nil:
            fmt.Println("Variabele heeft waarde nil")
        default:
            fmt.Printf("Onbekend type: %T\n", tt)
        }
    }
    
  3. Gebruik maken van het reflect-pakket: Hiermee kan informatie over het type en de waarde van de variabele worden verkregen tijdens runtime. Wordt gebruikt wanneer de types niet bekend zijn tijdens compilatie of voor complexere controles.

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func main() {
        var x float64 = 3.4
        v := reflect.ValueOf(x) // Verkrijg de reflectiewaarde
    
        fmt.Println("Type:", v.Type())                 // Geeft "Type: float64" weer
        fmt.Println("Categorie:", v.Kind())             // Geeft "Categorie: float64" weer
    
        y := "hallo"
        vv := reflect.ValueOf(y)
        fmt.Println("Type:", vv.Type())               // Geeft "Type: string" weer
        fmt.Println("Categorie:", vv.Kind())           // Geeft "Categorie: string" weer
    
        z := []int{1, 2, 3}
        vvv := reflect.ValueOf(z)
        fmt.Println("Type:", vvv.Type())             // Geeft "Type: []int" weer
        fmt.Println("Categorie:", vvv.Kind())         // Geeft "Categorie: slice" weer
    }
    

Het reflect-pakket is krachtiger, maar ook complexer in gebruik. Type assertion en type switch worden aanbevolen voor eenvoudige typecontroles op interface-variabelen, omdat ze veiliger en typegericht zijn.