Avatar ·

ما هو rune في Go وكيف يختلف عن البايت العادي؟

لقد بدأت للتو في تعلم Go وصادفت شيئًا غريبًا — نوع `rune`. يبدو أنه عدد صحيح، ولكن لماذا نحتاج إلى نوع منفصل؟ أحاول العمل مع السلاسل النصية ولاحظت أنه عندما آخذ حرفًا بواسطة الفهرس، أحصل على أرقام غريبة بدلاً من الحروف. هذا مثال أربكني: ```go package main import "fmt" func main() { s := "Привет, мир!" fmt.Println(s[0]) // يطبع 208، وليس 'П' fmt.Println(string(s[0])) // يطبع 'Ð'، وليس 'П' } ``` لماذا يحدث هذا؟ توقعت أن `s[0]` سيعطيني أول حرف من السلسلة. لكن بدلاً من ذلك أحصل على بعض البيانات غير الصالحة. قرأت أنه يجب استخدام `rune`، لكنني لا أفهم كيف بالضبط. جربت هكذا: ```go r := []rune(s) fmt.Println(string(r[0])) // الآن يطبع 'П' ``` هذا يعمل، لكنني لا أفهم لماذا. ما هو `rune` في الواقع؟ هل هو مجرد `int32`؟ أم أنه شيء آخر؟ لماذا نحتاج هذا النوع أصلاً إذا كان يمكننا التعامل مع البايتات؟ اشرح لي، من فضلك، كيف تعمل السلاسل النصية والبايتات والـ runes في Go.