2014-11-25 10 views
35

मैं docopt उपयोग कर रहा हूँ कमांड लाइन तर्क पार्स करने के लिए। यह काम करता है, और यह रूप मेंइंटरफ़ेस {} को स्ट्रिंग में कैसे परिवर्तित करें?

map[<host>:www.google.de <port>:80 --help:false --version:false] 

मानचित्र में परिणाम है, इस तरह के अब मैं host और बीच में एक कॉलन दो मूल्यों के साथ एक स्ट्रिंग के लिए port मूल्य श्रेणीबद्ध करना चाहते हैं। असल में, इस तरह के कुछ के रूप में:

host := arguments["<host>"] + ":" + arguments["<port>"] 

दुर्भाग्य से, यह काम नहीं करता है, जैसा कि मैंने त्रुटि संदेश मिलता है:

अवैध संचालन: तर्क [ ""] ":" (बेमेल प्रकार इंटरफ़ेस {} और स्ट्रिंग)

तो जाहिर है मैं मूल्य है कि मैं नक्शा (जो सिर्फ interface{} है से प्राप्त बदलने की आवश्यकता है, इसलिए यह एक स्ट्रिंग के लिए कुछ भी) हो सकता है। अब मेरा सवाल है, मैं यह कैसे कर सकता हूं?

+6

https://golang.org/ref/spec#Type_assertions – twotwotwo

उत्तर

51

आप type assertion.(string) जोड़ने की जरूरत है। यह आवश्यक है क्योंकि नक्शा प्रकार map[string]interface{} की है:

host := arguments["<host>"].(string) + ":" + arguments["<port>"].(string) 
+5

यह जोड़ना चाहते हैं कि इसे टाइप एसेशन - https://golang.org/ref/spec#Type_assertions कहा जाता है। मुझे एक बार इस सटीक शब्दावली को समझने में परेशानी थी। –

33

आप के बजाय सिर्फ Sprintf साथ %v फॉर्मेट स्पेसिफायर उपयोग करते हैं, एक प्रकार दावे का उपयोग करने की जरूरत नहीं है:

hostAndPort := fmt.Sprintf("%v:%v", arguments["<host>"], arguments["<port>"]) 
+0

इस ओर इशारा करते हुए :-) –

+0

इस के लिए धन्यवाद केवल एक चीज मैं जब डाली इंटरफेस टाइप करने के लिए {} 'स्ट्रिंग के रूप में के साथ की कोशिश कर रहा मेरे लिए काम करने के लिए मिल सकता था। – Pred

7

पर विस्तार करने के लिए क्या पीटर ने कहा: चूंकि आप इंटरफेस {} से स्ट्रिंग में जाने के लिए देख रहे हैं, इसलिए दावा करें कि कई आने वाले प्रकारों के लिए आपको खाते की आवश्यकता है क्योंकि दावा करना सिरदर्द का कारण बन जाएगा। आपको प्रत्येक प्रकार को संभवतः ज़ोर देना होगा और इसे सत्यापित करने से पहले यह टाइप करना होगा।

fmt.Sprintf (https://golang.org/pkg/fmt/#Sprintf) का उपयोग करना स्वचालित रूप से इंटरफ़ेस रूपांतरण संभालती है। चूंकि आप जानते हैं कि आपका वांछित आउटपुट प्रकार हमेशा एक स्ट्रिंग है, स्प्रिंटफ आपकी तरफ से अतिरिक्त कोड के गुच्छा के बिना इंटरफ़ेस के पीछे जो कुछ भी है, उसे संभालेगा।

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