Перебор карты golang

#map #go #loops

#словарь #Вперед #циклы

Вопрос:

У меня есть карта типа: map[string]interface{}

И, наконец, я могу создать что-то вроде (после десериализации из файла 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
  

Пожалуйста, помогите.

Комментарии:

1. Возможно ли предоставить тестовый пример? Трудно диагностировать проблему из того, что вы опубликовали, поскольку в том, что вы опубликовали, нет ничего, что могло бы вызвать цикл проверки типа. В частности, у меня возникли проблемы с пониманием того, как вы получите цикл проверки типа в теле функции.

Ответ №1:

Например,

 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]
  

Ответ №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
  

Комментарии:

1. Спасибо. что бы вызвать часть кода value.(map[string]int) ? это называется «приведением value к новому типу» в Go? (новое для перехода)

2. @123 Я думаю, введите утверждение go.dev/tour/methods/15

Ответ №3:

Вы можете сделать это с помощью одной строки:

 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]
  

Комментарии:

1. Поговорка Go: не будь умным, будь явным. Однострочники не являются целью в Go.