2014-11-17 12 views
9

Von einer Quelle kann ich nicht beeinflussen Ich habe Daten in einer Karte, die als map[interface {}]interface {} ankommt.Konvertieren Karte [Schnittstelle {}] Schnittstelle {} zum Zuordnen [Zeichenfolge] Zeichenfolge

Ich muss die enthaltenen Daten verarbeiten, vorzugsweise als map[string]string (die Daten innerhalb ist dafür perfekt geeignet).

Ich muss auch eine Liste der Schlüssel aus den Daten erzeugen, da diese vorher nicht bekannt sind.

meisten ähnliche Fragen, die ich im Internet finden könnte sagen, mehr oder weniger, dass dies unmöglich ist, aber wenn meine Karte m ist, fmt.Println(m) zeigt die Daten gibt, lesbar als map[k0:v0 K1:v1 k2:v2 ... ].

Wie kann ich tun, was fmt.Println kann?

+1

natürlich zu verarbeiten, sind die Daten dort, Sie muss nur durch die Karte iterieren. Es gibt keine Möglichkeit, diese Strukturen direkt zu konvertieren. – JimB

+1

mögliche Duplikate von [Typ Konvertieren von Schnittstellenscheiben in gehen] (http://stackoverflow.com/questions/12753805/type-converting-slices-of-interfaces-in-go) – JimB

+0

ich denke, ich muss reask. Die Karte, die ich bekomme, weigert sich zu iterieren, während die Antwort von @Swoogan perfekt funktioniert. – user3160501

Antwort

10

Vielleicht verstehe ich die Frage falsch, aber würde das funktionieren?

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, Sie können in einer Switch-Anweisung zuweisen, so müssen Sie nicht so die Typ-Assertion: http://play.golang.org/p/-ZeUXTKu9a – JimB

+0

Richtig, muss das in vermisst haben meine Eile zu antworten. Vielen Dank! – Swoogan

+0

Danke! Das habe ich anfangs versucht, aber gescheitert. Ihr Beispiel funktioniert, während "meine" Karte aufgrund der Typschnittstelle {} keine Reichweite hat. Beide werden von reflect.TypeOf als "map [interface {}] interface {}" gemeldet, verhalten sich aber anders .... ???? – user3160501

0

// data is map[string]interface{} 
 

 
form := make(map[string]string) 
 

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

0

Eine sichere Art und Weise unbekannte Schnittstellen, benutzen Sie einfach 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) 
} 
Verwandte Themen