将映射值转换为无括号的纯字符串?

时间:2018-09-12 18:44:06

标签: go

我有一个看起来像这样的地图字符串

map[first:[hello] second:[world]]

问题是,当我遍历它并返回值时,它们将返回[hello] [world],而我希望它们仅返回hello world

// currentMap is of type map[interface{}]interface{} originally
newStringMap := make(map[string]interface{})

for k, v := range currentMap {
    newStringMap[k.(string)] = v
}

return newStringMap

这怎么办?

1 个答案:

答案 0 :(得分:1)

根据您提供的以下信息:

  

当我遍历它并返回它们返回的值时[hello] [world]

似乎您的currentMap实际上将字符串切片[]string作为值存储在interface{}类型的后面。假定以上一行表示您在使用fmt.Println()或类似函数打印地图时看到此消息。

  

map[first:[hello] second:[world]]

以下是您问题的重现和解决方案:

package main

import (
    "fmt"
)

func main() {
    currentMap := make(map[interface{}]interface{})
    currentMap["first"] = []string{"hello"}
    currentMap["second"] = []string{"world"}
    newStringMap := make(map[string]interface{})

    fmt.Println("Problem:")

    fmt.Printf("%v\n", currentMap)

    fmt.Println("\nSolution:")

    for k, v := range currentMap {
        lst, ok := v.([]string)
        //fmt.Println(lst, ok)

        if ok && len(lst) > 0 {
            newStringMap[k.(string)] = v.([]string)[0]
        } else {
            newStringMap[k.(string)] = nil
        }
    }

    fmt.Printf("%v\n", newStringMap)
}

哪个输出到:

Problem:
map[first:[hello] second:[world]]

Solution:
map[first:hello second:world]

在这里尝试 https://play.golang.org/p/5XAA3m6MDX_b

currentMap中存储的内容不必总是相似的类型。 (如果是,那么为什么要使用interface {})。这意味着,不要忘记进行错误检查。我试图涵盖相同的内容。您可能需要根据地图中可能的actual types添加更多内容,类似于本节:

if ok && len(lst) > 0 {
    newStringMap[k.(string)] = v.([]string)[0]
} else {
    newStringMap[k.(string)] = nil
}