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?
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)
}
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
}
}
}
// data is map[string]interface{}
form := make(map[string]string)
for k, v := range data {
form[k] = v.(string)
}