(একটি অনুভূতি পেয়েছি যে উপরের উত্তরগুলি এখনও পার্থক্য এবং সম্পর্কের মধ্যে পার্থক্য 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()
সূচক অপারেশনটি []rune
utf8 অক্ষরের উপর ভিত্তি করে।