web-dev-qa-db-fra.com

Convertir la carte [interface {}] interface {} en mapper la chaîne [chaîne]

D'une source que je ne peux pas influencer, on me donne des données dans une carte, qui arrive sous la forme map[interface {}]interface {}.

Je dois traiter les données contenues, de préférence en tant que map[string]string (les données qu'il contient conviennent parfaitement).

Je dois également générer une liste des clés à partir des données, car elles ne sont pas connues à l’avance.

La plupart des questions similaires que j'ai pu trouver sur le Web disent plus ou moins que c'est impossible, mais si ma carte est m, fmt.Println(m) indique que les données sont là, lisibles au format map[k0:v0 K1:v1 k2:v2 ... ].

Comment puis-je faire ce que fmt.Println est capable de faire?

14
user3160501

Un moyen sécurisé de traiter des interfaces inconnues, utilisez simplement fmt.Sprintf ()

https://play.golang.org/p/gOiyD4KpQGz

package main

import (
    "fmt"
)

func main() {

    mapInterface := make(map[interface{}]interface{})   
    mapString := make(map[string]string)

    mapInterface["k1"] = 1
    mapInterface[3] = "hello"
    mapInterface["world"] = 1.05

    for key, value := range mapInterface {
        strKey := fmt.Sprintf("%v", key)
        strValue := fmt.Sprintf("%v", value)

        mapString[strKey] = strValue
    }

    fmt.Printf("%#v", mapString)
}
6
wakumaku

J'ai peut-être mal compris la question, mais est-ce que cela fonctionnerait?

m := make(map[interface{}]interface{})
m["foo"] = "bar"

m2 := make(map[string]string)   

for key, value := range m {        
    switch key := key.(type) {
    case string:
        switch value := value.(type) {
        case string:
            m2[key] = value
        }
    }
}
14
Swoogan

// data is map[string]interface{}

form := make(map[string]string)

for k, v := range data {
    form[k] = v.(string)
}

1
vinnitu