Golang中如何遍历嵌套的map
Golang中如何遍历嵌套的map 有没有办法可以遍历内部映射,而不仅仅是主映射?
The Go Play Space
具有语法高亮、海龟图形等功能的替代 Go (Golang) 游乐场
./prog.go:49:31: cannot range over days (variable of type interface{})
如果没人想使用 play space,我的代码如下:
package main
import (
"fmt"
)
func main() {
package main
import (
"fmt"
)
func main() {
var mapData = map[string]interface{}{
"Monday": map[string]interface{}{
"First": "34520 16th Ave S, Federal Way, WA+98003",
"Second": "",
"Third": "Lynwood",
},
"Tuesday": map[string]interface{}{
"First": "34520 16th Ave S, Federal Way, WA+98003",
"Second": "",
"Third": "Lynwood",
},
"Wednesday": map[string]interface{}{
"First": "34520 16th Ave S, Federal Way, WA+98003",
"Second": "",
"Third": "Lynwood",
},
"Thursday": map[string]interface{}{
"First": "34520 16th Ave S, Federal Way, WA+98003",
"Second": "",
"Third": "Lynwood",
},
"Friday": map[string]interface{}{
"First": "34520 16th Ave S, Federal Way, WA+98003",
"Second": "",
"Third": "Lynwood",
},
"Saturday": map[string]interface{}{
"First": "34520 16th Ave S, Federal Way, WA+98003",
"Second": "",
"Third": "Lynwood",
},
"Sunday": map[string]interface{}{
"First": "34520 16th Ave S, Federal Way, WA+98003",
"Second": "",
"Third": "Lynwood",
},
}
for _, days := range mapData {
fmt.Println("day", days)
for _, appointment := range days {
fmt.Println("appointment", appointment)
}
}
}
更多关于Golang中如何遍历嵌套的map的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
没关系,我找到解决方案了:使用 var mapData = map[string]map[string]interface{} 而不是 var mapData = map[string]interface{}。
var mapData = map[string]map[string]interface{}
更多关于Golang中如何遍历嵌套的map的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
- 为什么将其设为
map[string]interface{}而不是map[string]map[string]string? - 如果你确实需要
interface{},你需要在循环内使用“类型断言”来获取它们的实际类型。
func main() {
fmt.Println("hello world")
}
要遍历嵌套的map,你需要对interface{}类型进行类型断言。在你的代码中,days是interface{}类型,不能直接使用range遍历。以下是修正后的代码:
package main
import (
"fmt"
)
func main() {
var mapData = map[string]interface{}{
"Monday": map[string]interface{}{
"First": "34520 16th Ave S, Federal Way, WA+98003",
"Second": "",
"Third": "Lynwood",
},
"Tuesday": map[string]interface{}{
"First": "34520 16th Ave S, Federal Way, WA+98003",
"Second": "",
"Third": "Lynwood",
},
"Wednesday": map[string]interface{}{
"First": "34520 16th Ave S, Federal Way, WA+98003",
"Second": "",
"Third": "Lynwood",
},
"Thursday": map[string]interface{}{
"First": "34520 16th Ave S, Federal Way, WA+98003",
"Second": "",
"Third": "Lynwood",
},
"Friday": map[string]interface{}{
"First": "34520 16th Ave S, Federal Way, WA+98003",
"Second": "",
"Third": "Lynwood",
},
"Saturday": map[string]interface{}{
"First": "34520 16th Ave S, Federal Way, WA+98003",
"Second": "",
"Third": "Lynwood",
},
"Sunday": map[string]interface{}{
"First": "34520 16th Ave S, Federal Way, WA+98003",
"Second": "",
"Third": "Lynwood",
},
}
for dayName, days := range mapData {
fmt.Println("Day:", dayName)
// 类型断言,将interface{}转换为map[string]interface{}
if dayMap, ok := days.(map[string]interface{}); ok {
for key, appointment := range dayMap {
fmt.Printf(" %s: %s\n", key, appointment)
}
}
}
}
如果你需要处理更深层次的嵌套,可以使用递归函数:
func traverseMap(data map[string]interface{}) {
for key, value := range data {
if nestedMap, ok := value.(map[string]interface{}); ok {
fmt.Printf("%s:\n", key)
traverseMap(nestedMap)
} else {
fmt.Printf(" %s: %v\n", key, value)
}
}
}
func main() {
// 使用相同的mapData
traverseMap(mapData)
}
或者使用类型开关处理不同类型的嵌套值:
func printNestedMap(data interface{}, indent string) {
switch v := data.(type) {
case map[string]interface{}:
for key, value := range v {
fmt.Printf("%s%s:\n", indent, key)
printNestedMap(value, indent+" ")
}
default:
fmt.Printf("%s%v\n", indent, v)
}
}
func main() {
// 使用相同的mapData
for dayName, days := range mapData {
fmt.Println("Day:", dayName)
printNestedMap(days, " ")
}
}

