মডিউল পাঠ (4/5)
স্ট্রিং, বাইট, এবং রানস
Go-তে একটি string হল বাইটের একটি অপরিবর্তনীয় ক্রম। স্ট্রিং আক্ষরিক
UTF-8 এ এনকোড করা আছে। একটি 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 কে []রুনে রূপান্তর করুন এবং এর দৈর্ঘ্য অক্ষরে মুদ্রণ করুন।
ইঙ্গিত দেখান
স্পষ্ট রূপান্তর: `[]রুন(গুলি)`।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
লেন ("ciaò") কি?
s := "ciaò"
fmt.Println(len(s))রিক্যাপ
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।