Go 中的映射保留顺序 - 但不是你想象的那样
在 Go 中,映射是未排序的数据结构。这意味着映射中键值对的顺序不能保证一致。当您需要以特定顺序迭代映射时,这可能会出现问题。
考虑以下代码:
package main import ( "fmt" ) func main() { months := map[int]string{ 1: "January", 2: "February", 3: "March", 4: "April", 5: "May", 6: "June", 7: "July", 8: "August", 9: "September", 10: "October", 11: "November", 12: "December", } for index, month := range months { fmt.Println(index, "-", month) } }
当您运行此代码时,您可能期望输出为是从一月到十二月的月份。然而,事实并非如此。相反,您会看到月份以看似随机的顺序打印。
为什么会发生这种情况?
原因是 Go 映射中的键存储在未排序的大批。当您迭代映射时,键将按照它们在数组中存储的顺序进行访问。
解决方案
有几种不同的方法可以获取围绕这个问题。一种方法是使用数组按顺序存储键。然后,您可以迭代数组以按所需顺序访问映射的元素。
解决此问题的另一种方法是使用排序映射。排序映射是保证键按排序顺序存储的映射。当您需要以特定顺序迭代地图时,这非常有用。
示例
以下代码演示了如何使用数组来存储键order:
package main import ( "fmt" "sort" ) func main() { months := map[int]string{ 1: "January", 2: "February", 3: "March", 4: "April", 5: "May", 6: "June", 7: "July", 8: "August", 9: "September", 10: "October", 11: "November", 12: "December", } keys := []int{} for key := range months { keys = append(keys, key) } sort.Ints(keys) for _, key := range keys { fmt.Println(key, "-", months[key]) } }
当您运行此代码时,您将看到输出是按顺序从一月到一月十二月。
以上是如何保证 Go Map 的有序迭代?的详细内容。更多信息请关注PHP中文网其他相关文章!