我有一个看起来像这样的地图字符串
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
这怎么办?
答案 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
}