2014-09-10 4 views
5

मैंने इस समस्या को कुछ समय में चलाया है जब नक्शे की चाबियाँ उसी तरह से उपयोग करना चाहते हैं लेकिन नक्शे में मान अलग-अलग हैं। मैंने सोचा कि मैं एक ऐसा फ़ंक्शन लिख सकता हूं जो कि टाइप प्रकार के रूप में इंटरफ़ेस {} के साथ महत्वपूर्ण प्रकार लेता है लेकिन यह काम नहीं करता है।गो लैंग जेनेरिक नक्शा मान

func main() { 
    mapOne := map[string]int 
    mapTwo := map[string]double 
    mapThree := map[string]SomeStruct 

    useKeys(mapOne) 
} 
func useKeys(m map[string]interface{}) { 
    //something with keys here 
} 

यह सुनिश्चित करने के लिए कोई शानदार तरीका नहीं है कि मुझे कम मूल्यों को अलग-अलग मूल्यों के लिए सरल चीजों को फिर से लिखना आसान लगता है।

+2

आप सामने क्या मूल्य प्रकार आप को लेकर चिंतित हैं पता है, तो आप एक लिख सकते हैं 'func कुंजी (एम इंटरफ़ेस {})' (या एक फ़ंक्शन जो चैनल के माध्यम से या फ़ंक्शन को कॉल करके बढ़ती कुंजी प्रदान करता है) और एक [टाइप स्विच] (http://golang.org/ref/spec#Type_switches) करें यह। लेकिन मैं लूप को दोहराना चाहता हूं, जहां भी आप सभी चाबियों का उपयोग करना चाहते हैं, न केवल सामान्य "लिखने के लिए जाओ" कारणों के लिए, बल्कि अधिक संकलन-समय प्रकार की जांच के लिए। – twotwotwo

उत्तर

9

हालांकि नक्शे और स्लाइस जाने में सामान्य हैं, वे कॉन्वेंट नहीं हैं (न ही वे हो सकते हैं, क्योंकि इंटरफेस जेनेरिक नहीं हैं)। यह ऐसी भाषा के साथ काम करने का हिस्सा है जिसमें जेनेरिक नहीं है, आपको कुछ चीजों को दोहराना होगा।

आप वास्तव में सिर्फ किसी भी पुराने नक्शे की चाबी प्राप्त करने की आवश्यकता है, तो आप ऐसा करने के लिए प्रतिबिंब का उपयोग कर सकते हैं:

func useKeys(m interface{}) { 
    v := reflect.ValueOf(m) 
    if v.Kind() != reflect.Map { 
     fmt.Println("not a map!") 
     return 
    } 

    keys := v.MapKeys() 
    fmt.Println(keys) 
} 
+0

धन्यवाद। मुझे पता था कि यह उस भाषा का कुछ पहलू था जिसे मैं समझ नहीं रहा था। – mvryan

संबंधित मुद्दे