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中文網其他相關文章!