【问题标题】:How to convert different values from map[string]interface{} to type string如何将 map[string]interface{} 中的不同值转换为字符串类型
【发布时间】:2018-08-28 05:09:06
【问题描述】:

我在 interface{} 中有一张不同类型的地图,我需要将它们全部转换为字符串类型。类型断言是不够的。

package main

func main() {
    map1 := map[string]interface{}{"str1": "string one", "int1": 123, "float1": 0.123}

    var slc []string
    for _, j := range map1 {
        slc = append(slc, j.(string)) // panic: interface conversion: interface {} is int, not string
    }
}

【问题讨论】:

  • 你试过什么?你遇到了什么问题?
  • 另一种至少适用于原始(即非结构)类型的替代方法是附加fmt.Sprintf("%v", j)。这将通过它们的默认打印格式将它们全部转换为字符串。如果您想要特定类型的转换样式,请按照@Adrian 的建议使用类型开关。
  • 实际上,我需要使用该地图中的属性创建 POST 请求。所以我需要获取字符串类型来创建带有该参数的请求。我认为 fmt.Sprintf("%v", j) 对我有用。
  • 更好的方法是使用类型切换来检查使用类型断言的值,然后将所有内容转换为字符串。

标签: go types type-assertion


【解决方案1】:

@Adrian 和@Kaedys cmets 指出正确答案。进一步开发它,您可以执行以下操作:

package main

import "fmt"

func main() {
    map1 := map[string]interface{}{"str1": "string one", "int1": 123, "float1": 0.123}

    var slc []string
    for _, j := range map1 {
        switch v := j.(type) {
        case string:
            slc = append(slc, v)
        case fmt.Stringer:
            slc = append(slc, v.String())
        default:
            slc = append(slc, fmt.Sprintf("%v", v))
        }
    }

    fmt.Println(slc)
}

此答案适用于字符串,任何实现fmt.Stringer interface 的类型,默认为fmt.Sprintf("%v", ...)

【讨论】:

    猜你喜欢
    • 2018-12-20
    • 1970-01-01
    • 2015-01-14
    • 2021-05-26
    • 2022-07-06
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多