2014-11-17 15 views
9

Bir kaynaktan etkilenemiyorum Etkilenen bir vericide, verdiğim veriler map[interface {}]interface {}. İçerdiği verileri, tercihen map[string]string olarak işlemek gerekiyor (içindeki veriler buna çok uygundur).Harita [dönüştürücü {}} arayüzü {} [dize] dizgisini eşleştirmek için

Önceden bilinmediği gibi, verilerdeki anahtarların bir listesini de oluşturmalıyım. Web üzerinde bulabildiğim

En çok benzer sorular bu imkansız olduğunu, az ya da çok demek ama benim haritası m ise, fmt.Println(m), veri yoktur map[k0:v0 K1:v1 k2:v2 ... ] olarak okunabilir gösterir.

fmt.Println'in neler yapabileceğini nasıl yapabilirim?

+1

veriler, orada sadece harita üzerinde yinelemek zorunda. Bu yapıları doğrudan dönüştürmenin yolu yoktur. – JimB

+1

Mümkün olan yinelenen [Araya giren arayüzlerin tip çevirme dilimlerini] (http://stackoverflow.com/questions/12753805/type-converting-slices-of-interfaces-in-go) – JimB

+0

sanırım reask yapmak zorundayım. Elde ettiğim harita yinelemeyi reddederken, @Sogan'ın cevabı mükemmel çalışıyor. – user3160501

cevap

10

Belki de sorumu yanlış anladım, ama bu işe yarar mı?

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, bir anahtar deyiminde atayabilirsiniz, bu nedenle bu tür bir iddianın olması gerekmez: http://play.golang.org/p/-ZeUXTKu9a – JimB

+0

Doğru, bunu kaçırmış olmalısınız cevap vermek için acele et. Teşekkürler! – Swoogan

+0

Teşekkürler! Başlangıçta denedim ama başarısız oldu. Örneğiniz çalışıyor, "benim" haritanız {} türüne göre aralığını reddediyor. Her ikisi de reflect.TypeOf tarafından "map [interface {}] interface {}" olarak bildirilir ancak farklı davranır .... ???? – user3160501

0

// data is map[string]interface{} 
 

 
form := make(map[string]string) 
 

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

0

bilinmeyen arayüzleri işlemek için güvenli bir yoldur, sadece fmt.Sprintf() kullanın tabii

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) 
} 
İlgili konular