ماڈیول اسباق (4/5)
سٹرنگز، بائٹس اور رنس
گو میں ایک string بائٹس کا ایک غیر متغیر ترتیب ہے۔ سٹرنگ لٹریلز
UTF-8 میں انکوڈ شدہ ہیں۔ A rune int32 کا ایک عرف ہے اور
ایک واحد یونیکوڈ کوڈ پوائنٹ کی نمائندگی کرتا ہے۔
بائٹس اور رنز کے درمیان فرق کو سمجھنا ضروری ہے۔ جب کسی سٹرنگ میں لہجے، ایموجیز، آئیڈیوگرام یا کوئی بھی شامل ہو تو بگ سے بچیں۔ غیر ASCII کردار۔
string = بائٹس، حروف نہیں۔
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):
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): فی کریکٹر انڈیکسنگ
واضح تبدیلی: رنز کا ایک نیا ٹکڑا مختص کرتا ہے۔ مہنگا لیکن کبھی کبھی ضروری:
runes := []rune("ciaò")
fmt.Println(len(runes)) // 4
fmt.Println(string(runes[3])) // òstring(runes) الٹا تبدیلی ہے: ایک []rune لیتا ہے اور پیدا کرتا ہے
ایک UTF-8 سٹرنگ۔
تاریں ناقابل تغیر ہیں۔
s := "ciao"
// s[0] = 'C' // ERROR: cannot assign to s[0]تبدیل کرنے کے لیے، []byte یا []rune میں تبدیل کریں، چلائیں، واپس تبدیل کریں:
b := []byte(s)
b[0] = 'C'
s = string(b) // "Ciao"جوڑنا
+ آپریٹر کام کرتا ہے، لیکن ایک لوپ کے استعمال میں بہت سے کنکٹینشنز کے لیے
strings.Builder (زیادہ موثر، درمیانی مختص سے اجتناب کرتا ہے):
var sb strings.Builder
for i := 0; i < 5; i++ {
sb.WriteString("ab")
}
fmt.Println(sb.String()) // "ababababab"مفید پیکجز
strings:Contains,HasPrefix,Split,Join,ToUpper,Replacestrconv:Atoi,Itoa,ParseFloat,FormatInt...unicode:IsLetter,IsDigit,ToUpper...unicode/utf8:RuneCountInString(len([]rune(s))کا متبادل)۔
اسے آزمائیں
%d %c کا استعمال کرتے ہوئے سٹرنگ s کو رینج اور پرنٹ انڈیکس اور رون کے ساتھ دہرائیں۔
اشارہ دکھائیں۔
اسٹرنگ کے اوپر کی حد بائٹ آفسیٹ + رون کو لوٹاتا ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔
s کو []رن میں تبدیل کریں اور اس کی لمبائی کو حروف میں پرنٹ کریں۔
اشارہ دکھائیں۔
واضح تبدیلی: `[]rune(s)`۔
3 کوششوں کے بعد حل دستیاب ہے۔
len("ciaò") کیا ہے؟
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۔