Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert interface to interfaces slice?

Tags:

go

My input is an interface{}, and I know it can be an array of any type.

I'd like to read one of the elements of my input, so I try to convert my interface{} into an []interface{}, but go will give me the following error:

panic: interface conversion: interface {} is []map[string]int, not []interface {}

How can I do that conversion? (without reflect if possible).

Playground test

Thanks

like image 386
Boris K Avatar asked Sep 08 '26 04:09

Boris K


2 Answers

The solution involving the reflect package.

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var v interface{} = []string{"a", "b", "c"}

    var out []interface{}
    rv := reflect.ValueOf(v)
    if rv.Kind() == reflect.Slice {
        for i := 0; i < rv.Len(); i++ {
            out = append(out, rv.Index(i).Interface())
        }
    }
    fmt.Println(out)
}
// Output:
// [a b c]

I'm actually working on this right now as my issue involves taking something from a json object (map[string]interface{}) which may or may not contain a particular key ({"someKey": [a, b, c, ...]) and if it does contain that key then we want to take that (which will necessarily be interface{} type) and convert it to []interface{}. The method I've found so far is to use json marshall/unmarshall. This seems a little hacky to me, will update if I find a more elegant solution. Til then, you can have my method: https://play.golang.org/p/4VAwQQE4O0b

type a map[string]interface{}
type b []string

func main() {
    obj := a{
        "someKey": b{"a", "b", "c"},
    }
    if obj["someKey"] != nil { // check the value exists
        var someArr []interface{}

        //marshal interface to byte and then unmarshal to []interface{}
        somebytes, _ := json.Marshal(obj["someKey"])
        err := json.Unmarshal(somebytes, &someArr)
        if err != nil {
            fmt.Println("Error in unmarshal")
        }
        fmt.Println(someArr)
    }
}
like image 30
anna Avatar answered Sep 11 '26 00:09

anna



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!