2014-11-17 8 views
9

किसी स्रोत से मैं प्रभावित नहीं कर सकता हूं मुझे मानचित्र में डेटा दिया गया है, जो map[interface {}]interface {} के रूप में आता है।नक्शा [इंटरफ़ेस {}] इंटरफ़ेस {} को मानचित्र [स्ट्रिंग] स्ट्रिंग

मुझे निहित डेटा को संसाधित करने की आवश्यकता है, अधिमानतः map[string]string (डेटा इसके लिए बिल्कुल उपयुक्त है)।

मुझे डेटा से चाबियों की एक सूची भी उत्पन्न करने की आवश्यकता है, क्योंकि वे पहले से ज्ञात नहीं हैं।

अधिकांश इसी तरह के सवाल मैं वेब पर मिल सकता है और अधिक या कम कहते हैं, कि यह असंभव है, लेकिन अगर मेरी नक्शा m है, fmt.Println(m) से पता चलता डेटा नहीं है, map[k0:v0 K1:v1 k2:v2 ... ] के रूप में पठनीय।

मैं कैसे कर सकता हूं fmt.Println करने में सक्षम है?

+1

डेटा है, तो आप बस नक्शे के माध्यम से फिर से शुरू करना है। उन संरचनाओं को सीधे रूपांतरित करने का कोई तरीका नहीं है। – JimB

+1

संभावित डुप्लिकेट [इंटरफ़ेस के कनवर्टिंग स्लाइस टाइप करें] (http://stackoverflow.com/questions/12753805/type-converting-slices-of-interfaces-in-go) – JimB

+0

मुझे लगता है कि मुझे पुन: कार्य करना होगा। मुझे जो नक्शा मिलता है वह फिर से शुरू करने से इंकार कर देता है, जबकि @ सुवोगन का जवाब पूरी तरह से काम करता है। – user3160501

उत्तर

10

शायद मैं सवाल को गलत समझता हूं, लेकिन क्या यह काम करेगा?

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

एफवाईआई, आप एक स्विच स्टेटमेंट में असाइन कर सकते हैं, इसलिए आपको टाइप एस्सेशन करने की आवश्यकता नहीं है: http://play.golang.org/p/-ZeUXTKu9a – JimB

+0

ठीक है, उसमें याद किया होगा जवाब देने के लिए मेरी भीड़। धन्यवाद! – Swoogan

+0

धन्यवाद! यह वही है जो मैंने शुरू में किया था, लेकिन असफल रहा। आपका उदाहरण काम करता है, जबकि "मेरा" मानचित्र टाइप इंटरफ़ेस {} के कारण रेंज करने से इंकार कर देता है। प्रतिबिंबित करके दोनों को "नक्शा [इंटरफ़ेस {}] इंटरफ़ेस {}" के रूप में रिपोर्ट किया गया है। टाइप करें लेकिन अलग-अलग व्यवहार करें .... ???? – user3160501

0

// data is map[string]interface{} 
 

 
form := make(map[string]string) 
 

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

0

अज्ञात इंटरफेस पर कार्रवाई करने के लिए एक सुरक्षित तरीका है, बस 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) 
} 
निश्चित रूप से
संबंधित मुद्दे