गो

2012-09-07 15 views
57

में सबस्ट्रिंग निकालने के लिए मैं कंसोल (व्हाइटस्पेस समेत) से एक पूरी लाइन पढ़ने की कोशिश कर रहा हूं, फिर इसे संसाधित करता हूं। bufio.ReadString का उपयोग करना, न्यू लाइन चरित्र इनपुट के साथ एक साथ पढ़ा जाता है, तो मैं निम्नलिखित कोड न्यू लाइन चरित्र ट्रिम करने के लिए के साथ आया था:गो

input,_:=src.ReadString('\n') 
inputFmt:=input[0:len(input)-2]+"" //Need to manually add end of string 

वहाँ यह करने के लिए एक और अधिक मुहावरेदार रास्ता नहीं है? यही है, क्या पहले से ही एक पुस्तकालय है जो आपके लिए सबस्ट्रिंग निकालने पर अंतहीन नल बाइट का ख्याल रखता है?

(हाँ, मुझे पता है कि पहले से ही go readline -> string में न्यू लाइन चरित्र के बिना एक पंक्ति को पढ़ने के लिए एक रास्ता है, लेकिन मैं सुंदर स्ट्रिंग परिवर्तन के लिए और अधिक रहा हूँ।)

उत्तर

70

ऐसा लगता है कि आप काम कर रहे कारण असमंजस में हैं स्लाइस और स्ट्रिंग भंडारण प्रारूप है, जो से अलग है क्या आप सी में है

  • जाओ दुकानों में किसी भी टुकड़ा लंबाई (बाइट्स में) है, तो आप की जरूरत नहीं है len की लागत के बारे में परवाह करने के लिए ऑपरेशन:
  • गिनने की कोई आवश्यकता नहीं है, स्ट्रिंग नल टर्मि nated, इसलिए आपको एक शून्य बाइट को हटाने की आवश्यकता नहीं है, और आपको खाली स्ट्रिंग जोड़कर स्लाइसिंग के बाद 1 जोड़ने की आवश्यकता नहीं है।

पिछले चार निकालने के लिए (अगर यह एक एक बाइट वर्ण है), बस कर

inputFmt:=input[0:len(input)-1] 

और जैसा कि Uriel द्वारा देखा, तो आप छोटा कर सकते हैं के रूप में

inputFmt:=input[:len(input)-1] 
+7

आपको 0 (या :), 's = s [: len (s) -1] की भी आवश्यकता नहीं है। – uriel

+1

स्पष्टीकरण के लिए बहुत बहुत धन्यवाद; ऐसा लगता है कि रीडस्ट्रिंग फ़ंक्शन से लौटने वाली स्ट्रिंग के अंत में _two_ व्हाइटस्पेस वर्ण थे, इसलिए मैंने एक शून्य बाइट के लिए गलत लगाया। सी तारों के साथ भ्रम के लिए खेद है; मैं bufio के साथ fmt का उपयोग कर रहा था जिसके परिणामस्वरूप कंसोल में दिखाई देने वाली मजेदार चीजें थीं, इसलिए मैंने सोचा कि यह गंदे नल बाइट हो सकता है। बस एक अंतिम स्पष्टीकरण - ReadString से वह अतिरिक्त सफेद जगह क्या हो सकता है? – mark2222

+0

ठीक है, मैं अपने स्वयं के प्रश्न का उत्तर दूंगा - यह \ r तब \ n है: पी मजाकिया कंसोल आउटपुट इसलिए था क्योंकि मैंने \ r बिना \ r बनाया। – mark2222

14

जाओ तार हैं कि शून्य समाप्त नहीं हुआ है, और एक स्ट्रिंग के अंतिम चार को हटाने के लिए आप बस कर सकते हैं:

s = s[:len(s)-1] 
+0

यह गलत है और बग का कारण बन जाएगा। यह स्ट्रिंग से अंतिम * बाइट * स्ट्रिप्स करता है, जो इसे अमान्य यूटीएफ -8 (या अन्य मल्टीबाइट एन्कोडिंग) प्रस्तुत कर सकता है। –

+0

यह कैसे टूटता है इसके उदाहरण के लिए https://play.golang.org/p/K3HBBtj4Oi देखें। –

7

एक शून्य लंबाई इनपुट पर एक आतंक से बचने के लिए एक में truncate आपरेशन लपेट अगर

input, _ := src.ReadString('\n') 
var inputFmt string 
if len(input) > 0 { 
    inputFmt = input[:len(input)-1] 
} 
// Do something with inputFmt