Golang中如何遍历嵌套的map

Golang中如何遍历嵌套的map 有没有办法可以遍历内部映射,而不仅仅是主映射?

The Go Play Space

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


  1. 为什么将其设为 map[string]interface{} 而不是 map[string]map[string]string
  2. 如果你确实需要 interface{},你需要在循环内使用“类型断言”来获取它们的实际类型。
func main() {
    fmt.Println("hello world")
}

要遍历嵌套的map,你需要对interface{}类型进行类型断言。在你的代码中,daysinterface{}类型,不能直接使用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, "  ")
	}
}
回到顶部