Lặp lại qua bản đồ golang


89

Tôi có một bản đồ loại: map[string]interface{}

Và cuối cùng, tôi phải tạo một cái gì đó giống như (sau khi giải mã hóa từ tệp yml bằng goyaml)

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

Làm cách nào để tôi có thể duyệt qua bản đồ này? Tôi đã thử những cách sau:

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

Nhưng tôi gặp lỗi:

cannot range over mymap
typechecking loop involving for loop

Xin vui lòng giúp đỡ.


Có thể cung cấp một trường hợp thử nghiệm không? Thật khó để chẩn đoán sự cố từ những gì bạn đã đăng, vì không có gì cố hữu đối với những gì bạn đã đăng có thể gây ra vòng lặp kiểm tra loại. Đặc biệt, tôi đang gặp khó khăn khi tìm ra cách bạn nhận được vòng lặp kiểm tra kiểu trong một thân hàm.
SteveMcQwark

Câu trả lời:


107

Ví dụ,

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)
    }
}

Đầu ra:

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

4

Bạn có thể làm cho nó bằng một dòng:

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)
}

Đầu ra là:

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

20
Châm ngôn: Đừng khéo léo, hãy dứt khoát. Cờ vây không phải là mục tiêu trong cờ vây.
Inanc Gumus

2

Bạn có thể viết nó thành nhiều dòng như thế này,

$ 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)
                }

        }
}

Và đầu ra:

$ go run dict.go
[ foo ] has items:
        --> strength : 10
        --> age : 2000
[ bar ] has items:
        --> strength : 20
        --> age : 1000
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.