วนซ้ำทุกปุ่มบนแผนที่


316

มีวิธีรับรายการคีย์ทั้งหมดในแผนที่ภาษา Go หรือไม่? จำนวนองค์ประกอบถูกกำหนดโดยlen()แต่ถ้าฉันมีแผนที่เช่น:

m := map[string]string{ "key1":"val1", "key2":"val2" };

ฉันจะทำซ้ำคีย์ทั้งหมดได้อย่างไร

คำตอบ:


546

https://play.golang.org/p/JGZ7mN0-U-

for k, v := range m { 
    fmt.Printf("key[%s] value[%s]\n", k, v)
}

หรือ

for k := range m {
    fmt.Printf("key[%s] value[%s]\n", k, m[k])
}

รายละเอียดภาษา Go สำหรับforข้อความสั่งระบุว่าค่าแรกคือคีย์ตัวแปรตัวที่สองคือค่า แต่ไม่จำเป็นต้องมีอยู่


22
ในฐานะที่เป็นไปได้ gotcha โปรดทราบว่าคำสั่งของการทำซ้ำไม่ได้กำหนดไว้ groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ
mna

23
Sudhir: ข้อกำหนดภาษา golang กำหนดแผนที่อย่างชัดเจนว่ามีการเรียงลำดับของคีย์ไม่ชัดเจน นอกจากนี้ตั้งแต่ Go 1 คำสั่งซื้อที่สำคัญคือการสุ่มระหว่างการรันเพื่อป้องกันการพึ่งพาการรับรู้คำสั่งใด ๆ
Mark Renouf

6
โปรดทราบว่านี่ไม่ใช่การวนซ้ำที่ไม่แน่นอนซึ่งเป็นการบอกว่าการลบคีย์จะทำให้คุณต้องเริ่มการทำซ้ำ
Rick Smith

สำหรับชุดข้อมูลขนาดเล็กสามารถคาดเดาลำดับของแผนที่ได้
woot

14

นี่คือวิธีง่ายๆในการรับsliceแผนที่ - ปุ่ม

// Return keys of the given map
func Keys(m map[string]interface{}) (keys []string) {
    for k := range m {
        keys = append(keys, k)
    }
    return keys
}

// use `Keys` func
func main() {
    m := map[string]interface{}{
        "foo": 1,
        "bar": true,
        "baz": "baz",
    }
    fmt.Println(Keys(m)) // [foo bar baz]
}

เป็นไปได้หรือไม่ที่Keysฟังก์ชั่นนี้จะใช้แผนที่พร้อมกับกุญแจทุกประเภทไม่ใช่แค่สายอักขระ?
Robert T. McGibbon

func Keys(m map[interface{}]interface{}) (keys []interface{}), @ RobertT.McGibbon คุณต้องเปลี่ยนฟังก์ชั่น "prototype"
a8m

1
@ArielM นั่นจะใช้ได้กับประเภทที่แน่นอนmap[interface{}]interface{}เท่านั้น Go ไม่รองรับยาชื่อสามัญ คุณไม่สามารถสร้างฟังก์ชั่นด้วยmapพารามิเตอร์ที่ยอมรับแผนที่ที่มีประเภทของคีย์ที่แตกต่างกัน
icza

10

มีวิธีรับรายการคีย์ทั้งหมดในแผนที่ภาษา Go หรือไม่

ks := reflect.ValueOf(m).MapKeys()

ฉันจะทำซ้ำคีย์ทั้งหมดได้อย่างไร

ใช้คำตอบที่ยอมรับได้:

for k, _ := range m { ... }

1
ฉันคิดว่าคุณหมายถึงfor _, k := range v.MapKeys()ตั้งแต่ในตัวอย่างของคุณkจะเป็นดัชนี int ของส่วนของคีย์
Brian Leishman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.