Convert []interface to []string in Golang
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}"]
Related videos on Youtube
Comments
-
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 thetoValues()
function. See here. This works fine, but eventually I want to write the values to a csv file by using the csv package. Thecsv.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 almost 7 yearsThanks; didn't thought about using fmt.Sprint. Working fine now!
-
Alireza Soori over 4 yearswow, this helped me so much... but still I hope for a more robust way with assertion
-
Eric Lindsey over 4 years@AlirezaSoori you can have this with type assertion: just change
fmt.Sprint(v)
withv.(string)
. -
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/…