(একটি অনুভূতি পেয়েছি যে উপরের উত্তরগুলি এখনও পার্থক্য এবং সম্পর্কের মধ্যে পার্থক্য stringএবং []runeখুব স্পষ্টভাবে বর্ণনা করে না, তাই আমি উদাহরণ সহ আরও একটি উত্তর যুক্ত করার চেষ্টা করব))
হিসাবে @Strangeworkএর উত্তর বললেন, stringএবং []runeশান্ত ভিন্ন।
পার্থক্য - stringএবং []rune:
string valueকেবল পঠনযোগ্য বাইট স্লাইস। এবং, একটি স্ট্রিং আক্ষরিক utf-8 এ এনকোড করা আছে। প্রতিটি গৃহস্থালির কাজ stringআসলে লাগে 1 ~ 3 বাইট, প্রতিটি সময় runeলাগে 4 বাইট
- জন্য
string, উভয় len()এবং সূচক বাইট উপর ভিত্তি করে।
- কারণ
[]rune, উভয় len()এবং সূচকগুলি রুনে (বা int32) এর উপর ভিত্তি করে।
সম্পর্ক - stringএবং []rune:
- যখন আপনার কাছ থেকে রূপান্তর
stringকরতে []rune, যে স্ট্রিং প্রতিটি UTF-8 গৃহস্থালির কাজ একটি হয়ে rune।
- একইভাবে, বিপরীত রূপান্তরে, যখন রূপান্তরিত
[]runeহয় string, প্রত্যেকটি runeএকটিতে utf-8 চর হয়ে যায় string।
পরামর্শ:
- আপনি
stringএবং এর মধ্যে রূপান্তর করতে পারেন []runeতবে তবুও এগুলি আলাদা এবং সামগ্রিক আকার উভয়ই।
(আরও স্পষ্টভাবে এটি দেখানোর জন্য আমি একটি উদাহরণ যুক্ত করব))
কোড
string_rune_compare.go:
// string & rune compare,
package main
import "fmt"
// string & rune compare,
func stringAndRuneCompare() {
// string,
s := "hello你好"
fmt.Printf("%s, type: %T, len: %d\n", s, s, len(s))
fmt.Printf("s[%d]: %v, type: %T\n", 0, s[0], s[0])
li := len(s) - 1 // last index,
fmt.Printf("s[%d]: %v, type: %T\n\n", li, s[li], s[li])
// []rune
rs := []rune(s)
fmt.Printf("%v, type: %T, len: %d\n", rs, rs, len(rs))
}
func main() {
stringAndRuneCompare()
}
এক্সিকিউট:
স্ট্রিং_রুন_কম্পের.গো চালান
আউটপুট:
hello你好, type: string, len: 11
s[0]: 104, type: uint8
s[10]: 189, type: uint8
[104 101 108 108 111 20320 22909], type: []int32, len: 7
ব্যাখ্যা:
স্ট্রিংটির hello你好দৈর্ঘ্য 11, কারণ প্রথম 5 টি অক্ষর প্রতি 1 জন বাইট নেয়, যখন শেষ 2 টি চীনা অক্ষরে 3 বাইট লাগে।
- সুতরাং,
total bytes = 5 * 1 + 2 * 3 = 11
- যেহেতু
len()স্ট্রিং অন বাইটের উপর ভিত্তি করে, সুতরাং প্রথম লাইনটি মুদ্রিত হয়len: 11
- যেহেতু স্ট্রিংয়ের সূচকগুলিও বাইটের উপর ভিত্তি করে, সুতরাং নিম্নলিখিত 2 টি লাইনের প্রিন্টের প্রকারের মান
uint8(যেহেতু byteএকটি উপসর্গের নাম , চলমান uint8)।
যখন রূপান্তর stringকরতে []rune, এটি 7 UTF8 অক্ষর, এইভাবে 7 runes পাওয়া যায় নি।
- যেহেতু
len()অন []runeরুনের উপর ভিত্তি করে, সুতরাং শেষ লাইনটি মুদ্রিত len: 7।
- আপনি যদি
[]runeসূচকের মাধ্যমে পরিচালনা করেন তবে এটি রুনে ভিত্তিতে অ্যাক্সেস করবে।
যেহেতু প্রতিটি রুন মূল স্ট্রিংয়ের একটি utf8 চর থেকে, সুতরাং আপনি উভয়ই বলতে পারেন এবং উপরের len()সূচক অপারেশনটি []runeutf8 অক্ষরের উপর ভিত্তি করে।