मुख्य सामग्री पर जाएं
मॉड्यूल 4 · पाठ 4 का 5पाठ्यक्रम में 19/50~12 min
मॉड्यूल पाठ (4/5)

स्ट्रिंग्स, बाइट्स और रून्स

गो में string बाइट्स का एक अपरिवर्तनीय अनुक्रम है। स्ट्रिंग शाब्दिक UTF-8 में एन्कोड किया गया है। rune int32 का उपनाम है और एकल यूनिकोड कोड बिंदु का प्रतिनिधित्व करता है।

बाइट्स और रून्स के बीच अंतर को समझना आवश्यक है जब किसी स्ट्रिंग में उच्चारण, इमोजी, आइडियोग्राम या कोई भी हो तो बग से बचें गैर-ASCII वर्ण.

string = बाइट्स, अक्षर नहीं

Go
s := "ciaò"
fmt.Println(len(s))   // 5 — not 4!
fmt.Println(s[0])     // 99 ('c' as a byte)
fmt.Println(s[3])     // 195 (first byte of 'ò' in UTF-8)

len(s) बाइट्स की संख्या लौटाता है, दृश्यमान वर्णों की नहीं। अनुक्रमण s[i] i-th बाइट (uint8) लौटाता है, वर्ण नहीं।

for range रून्स को पुनरावृत्त करता है

for i, r := range s UTF-8 को तुरंत डिकोड करता है: i बाइट-ऑफ़सेट है रूण की शुरुआत में, r रूण (int32) है:

Go
s := "ciaò"
for i, r := range s {
    fmt.Printf("%d %c (U+%04X)\n", i, r, r)
}
// 0 c (U+0063)
// 1 i (U+0069)
// 2 a (U+0061)
// 3 ò (U+00F2)   <- starts at byte 3, takes 2 bytes

[]rune(s): प्रति-वर्ण अनुक्रमण

स्पष्ट रूपांतरण: रून्स का एक नया टुकड़ा आवंटित करता है। महँगा लेकिन कभी-कभी आवश्यक:

Go
runes := []rune("ciaò")
fmt.Println(len(runes))    // 4
fmt.Println(string(runes[3])) // ò

string(runes) उलटा रूपांतरण है: []rune लेता है और उत्पादन करता है एक UTF-8 स्ट्रिंग.

तार अपरिवर्तनीय हैं

Go
s := "ciao"
// s[0] = 'C'   // ERROR: cannot assign to s[0]

परिवर्तन करने के लिए, []byte या []rune में कनवर्ट करें, संचालित करें, वापस कनवर्ट करें:

Go
b := []byte(s)
b[0] = 'C'
s = string(b)   // "Ciao"

कड़ी

+ ऑपरेटर काम करता है, लेकिन लूप में कई संयोजनों के लिए इसका उपयोग करें strings.Builder (अधिक कुशल, मध्यवर्ती आवंटन से बचा जाता है):

Go
var sb strings.Builder
for i := 0; i < 5; i++ {
    sb.WriteString("ab")
}
fmt.Println(sb.String())   // "ababababab"

उपयोगी पैकेज

  • strings: Contains, HasPrefix, Split, Join, ToUpper, Replace...
  • strconv: Atoi, Itoa, ParseFloat, FormatInt...
  • unicode: IsLetter, IsDigit, ToUpper...
  • unicode/utf8: RuneCountInString (len([]rune(s)) का विकल्प)।

इसे अजमाएं

व्यायाम#go.m4.l4.e1
प्रयास: 0लोड हो रहा है...

स्ट्रिंग s को रेंज के साथ पुनरावृत्त करें और %d %c का उपयोग करके इंडेक्स और रूण प्रिंट करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

एक स्ट्रिंग पर रेंज बाइट-ऑफ़सेट + रूण लौटाती है।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम#go.m4.l4.e2
प्रयास: 0लोड हो रहा है...

S को []rune में कनवर्ट करें और इसकी लंबाई को वर्णों में प्रिंट करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

स्पष्ट रूपांतरण: `[]रूण(ओं)`।

3 प्रयासों के बाद समाधान उपलब्ध है

Quiz#go.m4.l4.e3
तैयार

लेन("ciaò") क्या है?

Go
s := "ciaò"
fmt.Println(len(s))
उत्तर विकल्प

संक्षिप्त

  • string = बाइट्स का अपरिवर्तनीय अनुक्रम, UTF-8 एन्कोडेड।
  • len(s) = बाइट्स; s[i] = i-वें बाइट (uint8)।
  • for i, r := range s रन को डिकोड करता है; i बाइट-ऑफ़सेट है।
  • []rune(s) चरित्र द्वारा अनुक्रमित करने के लिए (महंगा, आवंटित)।
  • परिवर्तन करने के लिए: []byte या []rune से गुजरें।
  • एक लूप में संयोजित करने के लिए: strings.Builder।
  • मुख्य पैकेज: strings, strconv, unicode, unicode/utf8।