2014-11-17 17 views
9

Da una fonte non posso influenzare Mi vengono dati dati in una mappa, che arriva come map[interface {}]interface {}.Converti mappa [interfaccia {}] interfaccia {} per mappare [stringa] stringa

Ho bisogno di elaborare i dati contenuti, preferibilmente come map[string]string (i dati all'interno sono perfettamente adatti per quello).

Devo generare anche un elenco di chiavi dai dati, in quanto non sono noti in anticipo.

domande molto simile che ho trovato sul web dicono più o meno, che questo è impossibile, ma se la mia mappa è m, fmt.Println(m) mostra i dati sono lì, leggibile come map[k0:v0 K1:v1 k2:v2 ... ].

Come posso fare ciò che fmt.Println è in grado di fare?

+1

ovviamente i dati sono lì, è devi solo scorrere la mappa. Non c'è modo di convertire direttamente quelle strutture. – JimB

+1

possibile duplicato di [Tipo conversione di interfacce in go] (http://stackoverflow.com/questions/12753805/type-conversing-slices-of-interfaces-in-go) – JimB

+0

credo di dover rasterizzare. La mappa che ottengo rifiuta di scorrere, mentre la risposta di @Swoogan funziona perfettamente. – user3160501

risposta

10

Forse ho frainteso la domanda, ma avrebbe funzionato?

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 
     } 
    } 
} 
+4

FYI, puoi assegnare in una dichiarazione switch, quindi non devi fare in modo che non sia necessario il tipo assertion: http://play.golang.org/p/-ZeUXTKu9a – JimB

+0

Giusto, devi averlo perso la mia fretta di rispondere Grazie! – Swoogan

+0

Grazie! Questo è quello che ho provato inizialmente, ma non è riuscito. Il tuo esempio funziona, mentre la "mia" mappa si rifiuta di variare a causa dell'interfaccia di tipo {}. Entrambi sono segnalati come "map [interface {}] interface {}" di reflect.TypeOf ma si comportano in modo diverso .... ???? – user3160501

0

// data is map[string]interface{} 
 

 
form := make(map[string]string) 
 

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

0

Un modo sicuro per elaborare interfacce sconosciuti, basta usare 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) 
}