在Golang中将[]interface转换为[]string

32
我正在使用github.com/fatih/structs软件包将结构体的所有字段值转换成[]interface{},并使用toValues()函数。请参见这里。这个功能很好用,但最终我想通过使用csv软件包将这些值写入csv文件。csv.Write()函数要求输入为[]string

简而言之:如何轻松地将toValues()的输出转换为字符串数组?

3个回答

50
即使所有的值都是具体类型string,你也不能简单地将[]interface{}转换为[]string,因为这两种类型有不同的内存布局和表示方式。详情请参见Cannot convert []string to []interface {}
必须定义如何使用string 值表示不同类型的值。
最简单和合理的方法是遍历值,并使用fmt.Sprint()获得每个值的string表示,例如:
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)

输出结果(在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}"]

谢谢,我没有想到可以使用 fmt.Sprint。现在运行得很好! - Rogier Lommers
1
哇,这帮了我很多……但我仍然希望有一种更加稳健的方式来进行断言。 - Alireza Soori
2
@AlirezaSoori,你可以使用类型断言来实现这个:只需将 fmt.Sprint(v) 更改为 v.(string) - Eric Lindsey
@icza - 这很奇怪 - 我尝试使用这个答案解决类似的问题,但是当我迭代时,我根本无法访问[]interface{},它返回一个“cannot range over foobar (type interface{})”错误。如果您有时间,我非常感谢您的帮助 - https://stackoverflow.com/questions/70611033/cant-convert-interface-to-string-in-go - Lou
1
这太过复杂和丑陋了。Go需要有更加简洁的方法来完成此类大量转换。否则,使用JSON将会成为一场噩梦。:( - Manish
@DanieleTesta 因为问题要求将 []interface{} 转换为 []stringfmt.Sprintf("%v", inter) 生成单个 string,而不是 []string - icza

0

你可以这样做:

    func text(msg ...interface{}) string {
        return fmt.Sprintf("%+v", msg...)
    }

-1
使用 fmt.Sprintf 将接口值转换为字符串。实际上,这种技术可以用于获取任何数据结构的字符串表示形式。
以下是代码示例:
var Foo interface{} = "Value"

str := fmt.Sprintf("%v", Foo)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接