مرکزی مواد پر جائیں
ماڈیول 4 · سبق 4 از 5کورس میں 19/50~12 min
ماڈیول اسباق (4/5)

سٹرنگز، بائٹس اور رنس

گو میں ایک string بائٹس کا ایک غیر متغیر ترتیب ہے۔ سٹرنگ لٹریلز UTF-8 میں انکوڈ شدہ ہیں۔ A 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لوڈ ہو رہا ہے…

%d %c کا استعمال کرتے ہوئے سٹرنگ s کو رینج اور پرنٹ انڈیکس اور رون کے ساتھ دہرائیں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

اسٹرنگ کے اوپر کی حد بائٹ آفسیٹ + رون کو لوٹاتا ہے۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش#go.m4.l4.e2
کوششیں: 0لوڈ ہو رہا ہے…

s کو []رن میں تبدیل کریں اور اس کی لمبائی کو حروف میں پرنٹ کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

واضح تبدیلی: `[]rune(s)`۔

3 کوششوں کے بعد حل دستیاب ہے۔

Quiz#go.m4.l4.e3
تیار

len("ciaò") کیا ہے؟

Go
s := "ciaò"
fmt.Println(len(s))
جواب کے اختیارات

Recap

  • string = بائٹس کی ناقابل تغیر ترتیب، UTF-8 انکوڈ شدہ۔
  • len(s) = بائٹس؛ s[i] = i-th بائٹ (uint8)۔
  • for i, r := range s رونز کو ڈی کوڈ کرتا ہے۔ i بائٹ آف سیٹ ہے۔
  • []rune(s) کریکٹر کے لحاظ سے اشاریہ (مہنگا، مختص)۔
  • تبدیل کرنے کے لیے: []byte یا []rune سے گزریں۔
  • ایک لوپ میں جوڑنا: strings.Builder۔
  • کلیدی پیکیجز: strings، strconv، unicode، unicode/utf8۔