इंटरफ़ेस {} को स्ट्रिंग में कैसे बदलें?


114

मैं कमांड-लाइन तर्कों को पार्स करने के लिए docopt का उपयोग कर रहा हूं । यह काम करता है, और यह एक नक्शे में परिणाम करता है, जैसे कि

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

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

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

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

अमान्य ऑपरेशन: तर्क [""] + ":" (बेमेल प्रकार इंटरफ़ेस {} और स्ट्रिंग)

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


जवाबों:


153

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

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

Docopt के नवीनतम संस्करण को रिटर्न देता है, जिसमें वस्तु है कि रूपांतरण के लिए तरीके:

host, err := arguments.String("<host>")
port, err := arguments.String("<port>")
host_port := host + ":" + port

7
जोड़ना चाहेंगे कि इसे टाइप एसेरेशन कहा जाता है - golang.org/ref/spec#Type_assertions । मुझे एक बार इस सटीक शब्दावली का पता लगाने में परेशानी हुई।
श्रीजित रामकृष्णन

अगर तर्क ["<होस्ट>"] शून्य है, तो यह घबराहट का कारण बनेगा
Savash

89

आपको एक प्रकार के अभिकथन का उपयोग करने की आवश्यकता नहीं है, इसके बजाय केवल %vप्रारूप विनिर्देशक का उपयोग करें Sprintf:

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

यह केवल एक चीज थी जो मुझे कास्ट इंटरफेस के रूप में टाइप करने की कोशिश करते समय मेरे लिए काम करने के लिए मिल सकती थी।
FilBot3

1
मेरे लिए, यह काम नहीं किया। यह बजाय बाइट ASCII चार्ट मुद्रण स्ट्रिंग के, 201 की तरह बन समाप्त हो गया "[50,48,49]", तो मैं fmt.Sprintf ( "% s", theThing) के बजाय ... का उपयोग कर समाप्त हो गया
फेलिप वाल्डेस

18

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.