মূল কন্টেন্টে যান
মডিউল 4 · 4-এর পাঠ 5কোর্সে 19/50~12 min
মডিউল পাঠ (4/5)

স্ট্রিং, বাইট, এবং রানস

Go-তে একটি 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লোড হচ্ছে...

%d %c ব্যবহার করে রেঞ্জ এবং প্রিন্ট ইনডেক্স এবং রুন সহ স্ট্রিং s পুনরাবৃত্তি করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

একটি স্ট্রিং এর উপর পরিসীমা বাইট-অফসেট + রুন প্রদান করে।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম#go.m4.l4.e2
প্রচেষ্টা: 0লোড হচ্ছে...

s কে []রুনে রূপান্তর করুন এবং এর দৈর্ঘ্য অক্ষরে মুদ্রণ করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

স্পষ্ট রূপান্তর: `[]রুন(গুলি)`।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

Quiz#go.m4.l4.e3
প্রস্তুত

লেন ("ciaò") কি?

Go
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।