Search code examples
arraysgointerfacetype-assertion

Golang convert interface{} to array of N size


I have an array of T wrapped in an interface. I know the size of the array beforehand. How do I write a generic function that gets back an array (or a slice) for any array length? E.g. for size 3 I want something like

var values interface{} = [3]byte{1, 2, 3}
var size = 3 // I know the size

var _ = values.([size]byte) // wrong, array bound must be a const expression

I can't really do a type switch because [1]byte is a different type from [2]byte etc so I'd have to explicitly enumerate all possible sizes.


Solution

  • Reflect is your friend here:

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func main() {
        var in interface{} = [3]byte{1, 2, 3} // an element from your []interface{}
        var size = 3                          // you got this
        out := make([]byte, size)             // slice output
    
        for i := 0; i < size; i++ {
            idxval := reflect.ValueOf(in).Index(i) // magic here
            uidxval := uint8(idxval.Uint())        // you may mess around with the types here
            out[i] = uidxval                       // and dump in output
        }
    
        fmt.Printf("%v\n", out)
    }
    

    Slices are the better choice output here, since you indicate that you have an undefined length. What Magic here does is indexing the value of your input interface through reflect. This is not quick, but it does the trick.