102 votes

Itération dans une carte golang

J'ai une carte de type : map[string]interface{}

Et finalement, j'arrive à créer quelque chose comme (après avoir désérialisé à partir d'un fichier yml en utilisant goyaml)

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

Comment puis-je itérer dans cette carte ? J'ai essayé ce qui suit :

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

Mais je reçois une erreur :

cannot range over mymap
typechecking loop involving for loop

Aidez-moi, s'il vous plaît.

0 votes

Est-il possible de fournir un cas de test ? Il est difficile de diagnostiquer le problème à partir de ce que vous avez posté, car il n'y a rien d'inhérent à ce que vous avez posté qui pourrait causer une boucle de vérification de type. En particulier, j'ai du mal à comprendre comment vous pouvez obtenir une boucle de vérification de type dans un corps de fonction.

118voto

peterSO Points 25725

Par exemple,

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

Sortie :

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

5voto

han solo Points 4924

Vous pourriez simplement l'écrire en multiligne comme ceci,

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

        }
}

Et le résultat :

$ go run dict.go
[ foo ] has items:
        --> strength : 10
        --> age : 2000
[ bar ] has items:
        --> strength : 20
        --> age : 1000

4voto

Bryce Points 855

Vous pouvez le faire par une ligne :

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

La sortie est :

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

25 votes

Proverbe : Ne soyez pas intelligent, soyez explicite. Les "one-liners" ne sont pas le but du Go.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X