गो में सब्सट्रेटिंग निकालना


114

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

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

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

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

जवाबों:


146

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

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

अंतिम चार (यदि यह एक बाइट चार है) को हटाने के लिए, बस करें

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

11
आपको 0 (या :), s = s[:len(s)-1]की आवश्यकता नहीं होगी।
यूरियाल

8
कृपया ध्यान दें कि यह विधि यूनिकोड स्ट्रिंग्स के साथ काम नहीं करेगी! groups.google.com/forum/#!msg/golang-nuts/ZeYei0IWrLg/...
Melllvar

@ मेल्लवार इसीलिए मैंने "अगर यह एक बाइट चार है" को प्राथमिकता दी । यदि आप एक से अधिक बाइट (जो कि ओपी का मामला नहीं है) लेने वाले चार को हटाना चाहते हैं, तो आपको अनुकूलित करना होगा।
सेज्यूरेट

25

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

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

10
यह गलत है और बग का कारण बनेगा। यह स्ट्रिंग को अंतिम बाइट करता है, जो इसे अमान्य UTF-8 (या अन्य मल्टीबाइट एन्कोडिंग) प्रदान कर सकता है।
डॉ। 10

3
यह कैसे टूटता है, इसके उदाहरण के लिए play.golang.org/p/K3HBBtj4Oi देखें ।
डॉ। साइब्रेन

10

शून्य लंबाई इनपुट पर घबराहट से बचने के लिए, यदि एक में ट्रंकसेट ऑपरेशन को लपेटें

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

9

यह गो में प्रतिस्थापन करने के लिए सरल है

package main

import "fmt"

var p = fmt.Println

func main() {

  value := "address;bar"

  // Take substring from index 2 to length of string
  substring := value[2:len(value)]
  p(substring)

}

7

चेतावनी: अकेले स्ट्रिंग्स पर काम करना केवल ASCII के साथ काम करेगा और गलत गिना जाएगा जब इनपुट एक गैर-ASCII UTF-8 एन्कोडेड वर्ण है, और संभवतः भ्रष्ट अक्षर भी होंगे क्योंकि यह मल्टीबाइट चार्ट मिड-सीक्वेंस को काट देता है।

यहाँ एक UTF-8-जागरूक संस्करण है:

func substr(input string, start int, length int) string {
    asRunes := []rune(input)

    if start >= len(asRunes) {
        return ""
    }

    if start+length > len(asRunes) {
        length = len(asRunes) - start
    }

    return string(asRunes[start : start+length])
}

1
इस तरह से और अधिक उत्थान की जरूरत है - मैं सिर्फ utf-8 जागरूक विभाजन का उपयोग नहीं करके बुरी तरह से काट लिया गया।
कोलांटे


2

8 साल बाद मैं इस मणि पर ठोकर खाई, और फिर भी मुझे विश्वास नहीं होता कि ओपी का मूल प्रश्न वास्तव में उत्तर दिया गया था:

इसलिए मैं न्यूलाइन वर्ण को ट्रिम करने के लिए निम्न कोड के साथ आया

जबकि bufio.Readerप्रकार एक ऐसी ReadLine() विधि का समर्थन करता है जो दोनों को निकालता है \r\nऔर \nइसका मतलब निम्न स्तर के फ़ंक्शन के रूप में होता है जो उपयोग करने के लिए अजीब है क्योंकि बार-बार जांच आवश्यक है।

व्हाट्सएप को हटाने के लिए IMO एक मुहावरेदार तरीका है जो गोलंग के तार पुस्तकालय का उपयोग करता है :

input, _ = src.ReadString('\n')

// more specific to the problem of trailing newlines
actual = strings.TrimRight(input, "\r\n")

// or if you don't mind to trim leading and trailing whitespaces 
actual := strings.TrimSpace(input)

गोलंग खेल के मैदान में एक्शन में इस उदाहरण को देखें: https://play.golang.org/p/HrOWH0kl3Ww

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