【问题标题】:Convert []interface to []string in Golang在 Golang 中将 []interface 转换为 []string
【发布时间】:2017-10-17 02:12:00
【问题描述】:

我正在使用github.com/fatih/structs 包通过toValues() 函数将结构的所有字段的值转换为[]interface{}。见here。这工作正常,但最终我想通过使用 csv 包将值写入 csv 文件。 csv.Write() 函数需要 []string 作为输入。

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

【问题讨论】:

    标签: string go struct interface slice


    【解决方案1】:

    您不能简单地将[]interface{} 转换为[]string,即使所有值都是具体类型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。现在工作正常!
    • 哇,这对我帮助很大......但我仍然希望有一种更强大的断言方式
    • @AlirezaSoori 你可以通过类型断言来实现:只需将fmt.Sprint(v) 更改为v.(string)
    • @icza - 这很奇怪 - 我已经尝试使用这个答案来解决类似的问题,但我在迭代时根本无法访问 []interface{},它返回“无法覆盖foob​​ar(类型接口 {})”错误。如果您有时间,我将非常感谢您的意见 - stackoverflow.com/questions/70611033/…
    【解决方案2】:

    使用 fmt.Sprintf 将接口值转换为字符串。事实上,这种技术可以用来获取任何数据结构的字符串表示。

    这里是代码示例,

    var Foo interface{} = "Value"
    
    str := fmt.Sprintf("%v", Foo)
    

    【讨论】:

      猜你喜欢
      • 2015-01-14
      • 2014-12-30
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 2017-01-17
      相关资源
      最近更新 更多