Convert []interface to []string in Golang

24,949

You can't simply convert []interface{} to []string even if all the values are of concrete type string, because those 2 types have different memory layout / representation. For details see Cannot convert []string to []interface {}.

You have to define how you want values of different types to be represented by string values.

The easiest and sensible way would be to iterate over the values, and use fmt.Sprint() to obtain a string representation of each, e.g.:

t := []interface{}{
    "zero",
    1, 2.0, 3.14,
    []int{4, 5},
    struct{ X, Y int }{6, 7},
}
fmt.Println(t)

s := make([]string, len(t))
for i, v := range t {
    s[i] = fmt.Sprint(v)
}
fmt.Println(s)
fmt.Printf("%q\n", s)

Output (try it on the Go Playground):

[zero 1 2 3.14 [4 5] {6 7}]
[zero 1 2 3.14 [4 5] {6 7}]
["zero" "1" "2" "3.14" "[4 5]" "{6 7}"]
Share:
24,949

Related videos on Youtube

Rogier Lommers
Author by

Rogier Lommers

Software Engineer at bol.com.

Updated on December 07, 2021

Comments

  • Rogier Lommers
    Rogier Lommers over 2 years

    I'm using the github.com/fatih/structs package to convert values of all fields of a struct into []interface{} with the toValues() function. See here. This works fine, but eventually I want to write the values to a csv file by using the csv package. The csv.Write() function requires []string as input.

    So in short: how can I easily convert the output of toValues() into an array of strings?

  • Rogier Lommers
    Rogier Lommers almost 7 years
    Thanks; didn't thought about using fmt.Sprint. Working fine now!
  • Alireza Soori
    Alireza Soori over 4 years
    wow, this helped me so much... but still I hope for a more robust way with assertion
  • Eric Lindsey
    Eric Lindsey over 4 years
    @AlirezaSoori you can have this with type assertion: just change fmt.Sprint(v) with v.(string).
  • Lou
    Lou over 2 years
    @icza - This is weird - I've tried using this answer for a similar problem, but I simply can't access the []interface{} when iterating, it returns a "cannot range over foobar (type interface{})" error. If you have time I'd greatly appreciate your input - stackoverflow.com/questions/70611033/…