การวนลูป Map ในภาษา Go จะไม่การันตีเสมอไปว่า ลำดับ ของชุดข้อมูล ที่ถูกเข้าถึงในแต่ละรอบของการลูป จะเป็นไปตามลำดับที่เรากำหนด เพราะข้อมูลที่อยู่ใน Map จะเป็นการเก็บแบบ “ไม่มีลับดับที่แน่นนอน” (unordered)
จาก code snippet ด้านล่าง จะสังเกตได้ว่าในแต่ละรอบของ การวนลูป, ข้อมูลภายใน Map จะถูก print ออกมาสลับตำแหน่งกัน ทั้งๆที่เราได้กำหนดค่าให้ a,b และ c เป็นไปตามลำดับในเบื้องต้น
func main() {
kv := make(map[string]int)
kv["a"] = 0
kv["b"] = 1
kv["c"] = 2
for i := 0; i < 5; i++ {
for k, v := range kv {
fmt.Printf("key: %s --> value: %v\n", k, v)
}
fmt.Println("----------")
}
}
หากต้องการเข้าถึงข้อมูลในลับดับที่แน่นอน จาก Map เราสามารถใช้ทริคง่ายๆ โดยการเก็บค่า key ไว้ใน slice และใช้ key อันนี้ในการเข้าถึง value จาก Map
var keys []string
for k,_ := range kv {
keys = append(keys, k)
}
แต่อย่างที่กล่าวไป การวนลูป Map จะไม่การันตีลำดับชุดข้อมูลที่เข้าถึง ดังนั้นเราจึงต้อง sort ข้อมูลที่ได้มาตามลำดับที่ต้องการ
sort.Strings(keys)
และลองมาวนลูป Keys เพื่อเข้าถึงข้อมูลจาก Map กันอีกครั้ง
for i := 0; i < 5; i++ {
for _, key := range keys {
fmt.Printf("key: %s --> value: %v\n", key, kv[key])
}
fmt.Println("----------")
}
ข้อมูลที่ได้จาก Map ก็จะมีลับดับที่แน่นอน.
Top comments (0)