Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

interface{} variable to []interface{}

I have an interface{} variable and I know it's a pointer to slice:

func isPointerToSlice(val interface{}) bool {
    value := reflect.ValueOf(val)
    return value.Kind() == reflect.Ptr && value.Elem().Kind() == reflect.Slice
}

But I'm finding difficult to type cast it into an []interface{} variable:

if isPointerToSlice(val) {
  slice, worked := reflect.ValueOf(val).Elem().Interface().([]interface{})
  // 'worked' is false :(
}

This doesn't work. Any idea how can I solve this?

like image 484
Pablo Fernandez Avatar asked Apr 29 '26 01:04

Pablo Fernandez


2 Answers

If you just want to convert a slice to []interface{} you can use something like this:

func sliceToIfaceSlice(val interface{}) []interface{} {
    rf := reflect.Indirect(reflect.ValueOf(val)) // skip the pointer
    if k := rf.Kind(); k != reflect.Slice && k != reflect.Array {
        // panic("expected a slice or array")
        return nil
    }
    out := make([]interface{}, rf.Len())
    for i := range out {
        out[i] = rf.Index(i).Interface()
    }
    return out
}

playground

like image 194
OneOfOne Avatar answered May 01 '26 17:05

OneOfOne


You can simply use type assertion to obtain the value stored in an interface, e.g.

if isPointerToSlice(val) {
    var result []interface{}
    result = *val.(*[]interface{})
    fmt.Println(result)
} else {
    fmt.Println("Not *[]interface{}")
}

The type of the value stored in the interface as you claim is pointer to []interface{}, which is *[]interface{}. The result of the type assertion will be a pointer, just dereference it to get the slice []interface{}.

Using short variable declaration:

result := *val.(*[]interface{}) // type of result is []interface{}

Try it on the Go Playground.


Also your attempt also works:

slice, worked := reflect.ValueOf(val).Elem().Interface().([]interface{})
fmt.Println(slice, worked)

Here's the edited the Playground example which proves your solution works.

But using reflection is unnecessary (as it can be done with type assertion).

Also note that *[]interface{} and *[]someOtherType are 2 different types and you can't obtain a value of *[]interface{} if there is something else in val.

like image 23
icza Avatar answered May 01 '26 17:05

icza



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!