2017-02-23 4 views
6

मैं एक समारोह है:का उपयोग नक्शा [स्ट्रिंग] प्रकार नक्शे के पैरामीटर के रूप में पूर्णांक [इंटरफ़ेस {}] इंटरफ़ेस {}

m := make(map[string]int) 
m["k1"] = 7 
m["k2"] = 13 
fmt.Println(ReturnTuples(m)) 
:

func ReturnTuples(map_ map[interface{}]interface{}) [][]interface{} { 

जिसमें मैं इस तरह कॉल करने के लिए कोशिश कर रहा हूँ

लेकिन मैं इसे string के बाद से काम नहीं करना चाहिए

cannot use m (type map[string]int) as type map[interface {}]interface {} in argument to ReturnTuples 

हो रही है और int दोनों को लागू interface{} ?

मैंने खोज की है और सबसे अच्छा मुझे मिल सकता है Convert map[interface {}]interface {} to map[string]string लेकिन यह जवाब नहीं देगा कि मैं m का तर्क के रूप में क्यों उपयोग नहीं कर सकता।

मुझे यह भी विश्वास है कि अगर समारोह की तर्क केवल interface{} थी तो यह भी काम करेगी, क्योंकि map[something][something]interface लागू करता है, है ना? ऐसा करने का सबसे अच्छा तरीका क्या है, और यह मेरे मामले में क्यों काम नहीं करेगा?

+2

https://golang.org/doc/faq#covariant_types – Volker

+0

@ वोल्कर लेकिन मुझे विधि प्रकार गलत नहीं दिख रहा है, मैंने विधि प्रकार को भी लागू नहीं किया क्योंकि मैं केवल फ़ंक्शन के रिटर्न वैल्यू को प्रिंट कर रहा हूं। कंपाइलर कहता है कि समस्या –

+3

तर्क प्रकार पर है क्योंकि आप 'नक्शा [स्ट्रिंग] int' को पास नहीं कर सकते हैं क्योंकि' नक्शा [इंटरफ़ेस {}] इंटरफेस {} 'है कि 'string',' int', और 'इंटरफेस {}' सभी में अलग-अलग डेटा संरचना है। 'स्ट्रिंग' एक एकल सूचक है जो शायद 64 बिट है, 'int' शायद 64 बिट मान पर हस्ताक्षर किया गया है, हालांकि' इंटरफ़ेस {} 'दो पॉइंटर्स की संरचना है [blankInterface] (https://golang.org/src/reflect/value .go # L174) – ymonad

उत्तर

6

आपकी समस्या का समाधान, बस खाली इंटरफेस की एक खाली इंटरफेस के रूप में नक्शे आरंभ:

m := map[interface{}]interface{}

तो आप 'ReturnTuples' समारोह में किसी भी प्रकार की कुंजी या मान आप चाहते हैं निर्दिष्ट कर सकते हैं।

playground example

नोट: याद रखें कि आप बाद में मूल प्रकार के रूप में मानों का उपयोग करना चाहते हैं, आप प्रकार अभिकथन उपयोग करने के लिए, क्योंकि अब वे प्रकार के होते हैं की आवश्यकता होगी interface{}

आप कुछ इस तरह कर सकते हैं इस, थे anything एक मैप मान जो आप उपयोग कर प्राप्त कर सकते हैं है पाश के लिए एक:

switch v := anything.(type) { 
     case string: 
      fmt.Println(v) 
     case int32, int64: 
      fmt.Println(v) 
     case string: 
      fmt.Println(v) 
     case SomeCustomType: 
      fmt.Println(v) 
     default: 
      fmt.Println("unknown") 
} 

आप "क्यों" 012 के लिए एक स्पष्टीकरण के लिए देख रहे हैंने एक पूरा उत्तर दिया है, इसलिए मैं इसे फिर से दोहराना नहीं चाहता हूं।

यह मतलब आशा

पुनश्च: सवाल है, मेरी आँखों में एक कानूनी एक पर नीचे वोट नहीं मिलता ...

+1

धन्यवाद, यह वही है जो मुझे चाहिए था। और हाँ, मैं इन डाउनवॉट्स से थक गया हूँ। सबकुछ अब डाउनवॉटेड है ... –

+0

ऐसा लगता है कि खेल के मैदान लिंक अब "कानूनी कारणों के लिए अनुपलब्ध" के कारण काम नहीं करता है। –

+0

स्टीफन एल ने अभी इसकी जांच की और यह काम किया –

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