ทำซ้ำผ่านแผนที่โกลัง


89

ฉันมีแผนที่ประเภท: map[string]interface{}

และในที่สุดฉันก็สามารถสร้างสิ่งที่ต้องการ (หลังจาก deserializing จากไฟล์ yml โดยใช้ goyaml)

mymap = map[foo:map[first: 1] boo: map[second: 2]]

ฉันจะทำซ้ำผ่านแผนที่นี้ได้อย่างไร ฉันลองทำสิ่งต่อไปนี้:

for k, v := range mymap{
...
}

แต่ฉันได้รับข้อผิดพลาด:

cannot range over mymap
typechecking loop involving for loop

กรุณาช่วย.


เป็นไปได้ไหมที่จะให้กรณีทดสอบ? เป็นการยากที่จะวินิจฉัยปัญหาจากสิ่งที่คุณโพสต์เนื่องจากไม่มีสิ่งใดที่เกิดขึ้นกับสิ่งที่คุณโพสต์ซึ่งอาจทำให้เกิดการวนรอบการตรวจสอบประเภท โดยเฉพาะอย่างยิ่งฉันมีปัญหาในการหาวิธีที่คุณจะได้รับลูปการตรวจสอบประเภทในเนื้อหาฟังก์ชัน
SteveMcQwark

คำตอบ:


107

ตัวอย่างเช่น,

package main

import "fmt"

func main() {
    type Map1 map[string]interface{}
    type Map2 map[string]int
    m := Map1{"foo": Map2{"first": 1}, "boo": Map2{"second": 2}}
    //m = map[foo:map[first: 1] boo: map[second: 2]]
    fmt.Println("m:", m)
    for k, v := range m {
        fmt.Println("k:", k, "v:", v)
    }
}

เอาท์พุต:

m: map[boo:map[second:2] foo:map[first:1]]
k: boo v: map[second:2]
k: foo v: map[first:1]

4

คุณสามารถทำได้โดยหนึ่งบรรทัด:

mymap := map[string]interface{}{"foo": map[string]interface{}{"first": 1}, "boo": map[string]interface{}{"second": 2}}
for k, v := range mymap {
    fmt.Println("k:", k, "v:", v)
}

ผลลัพธ์คือ:

k: foo v: map[first:1]
k: boo v: map[second:2]

21
Go Proverb: อย่าฉลาดจงชัดเจน One-liners ไม่ใช่เป้าหมายใน Go
Inanc Gumus

2

คุณสามารถเขียนมันออกมาเป็นหลายบรรทัดแบบนี้

$ cat dict.go
package main

import "fmt"

func main() {
        items := map[string]interface{}{
                "foo": map[string]int{
                        "strength": 10,
                        "age": 2000,
                },
                "bar": map[string]int{
                        "strength": 20,
                        "age": 1000,
                },
        }
        for key, value := range items {
                fmt.Println("[", key, "] has items:")
                for k,v := range value.(map[string]int) {
                        fmt.Println("\t-->", k, ":", v)
                }

        }
}

และผลลัพธ์:

$ go run dict.go
[ foo ] has items:
        --> strength : 10
        --> age : 2000
[ bar ] has items:
        --> strength : 20
        --> age : 1000
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.