Menu
flag Ar iconالعربيةdown icon

أنواع البيانات في Golang: int وfloat64 وstring وbool وbyte وrune

الأنواع المدمجة في Go: أحجام الأعداد الصحيحة ونطاقاتها، float32 وfloat64، bool وstring، byte وrune، الأعداد المركّبة، القيم الصفرية، وكيف تطبع نوع قيمة بـ %T.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

الأنواع الأساسية في Go هي الأرقام والقيم المنطقية والنصوص. لكل متغيّر نوع واحد بالضبط يُحدَّد وقت الترجمة، ولا تحوّل Go بين الأنواع نيابة عنك أبدًا. يطبع %T نوع أي قيمة:

لاحظ أن 'G' تُطبع 71 بنوع int32: الحرف بين علامتي اقتباس مفردتين هو rune، أي رقم (نقطة رمز Unicode). وrune اسم بديل لـ int32 (النوع نفسه باسم ثانٍ)، لذا يبلغ %T عن int32. وبالمثل يبلغ byte عن uint8.

الأعداد الصحيحة

النوعالحجمالنطاق
int88 بتمن -128 إلى 127
int1616 بتمن -32,768 إلى 32,767
int3232 بتمن نحو -2.1 مليار إلى 2.1 مليار
int6464 بتمن نحو -9.2 كوينتليون إلى 9.2 كوينتليون
uint8 (byte)8 بتمن 0 إلى 255
uint1616 بتمن 0 إلى 65,535
uint3232 بتمن 0 إلى نحو 4.3 مليار
uint6464 بتمن 0 إلى نحو 18.4 كوينتليون
int، uint32 أو 64 بتحجم كلمة المنصّة
uintptrحجم المنصّةيحمل قيمة مؤشر، للشيفرة منخفضة المستوى

استخدم int افتراضيًا. تعيد len() قيمة int، وفهارس الشرائح int، وعدّادات الحلقات int. وعلى كل منصّة 64 بت يكون int بحجم 64 بت. لجأ إلى الأنواع محدّدة الحجم عندما يكون الحجم جزءًا من عقد: int32 في صيغة ملف ثنائية، وuint8 للبايتات الخام، وint64 لطابع زمني Unix بالنانوثانية.

تجنّب الأنواع عديمة الإشارة للكميات التي "لا يمكن أن تكون سالبة" مثل الأعداد. الطرح إلى ما دون الصفر يلتفّ إلى رقم ضخم بدل أن ينتج رقمًا سالبًا يمكنك التقاطه.

الحدود والفيضان

للحزمة math ثابت لكل حد. ووقت التشغيل تلتفّ العمليات الحسابية الصحيحة التي تفيض بصمت:

لا panic ولا خطأ: 127 + 1 تصبح -128. التعابير الثابتة وحدها تُفحص وقت الترجمة (var b int8 = 128 لا تُترجم). إذا كان الفيضان ممكنًا في بياناتك، فافحص قبل العملية أو استخدم math/big.

حرفيات الأعداد الصحيحة

million := 1_000_000   // underscores for readability (Go 1.13+)
mask := 0xFF           // hexadecimal
perm := 0o755          // octal (also the older form 0755)
flags := 0b1010        // binary

الأعداد العشرية

النوعالحجمالدقة
float3232 بتنحو 6 إلى 9 أرقام معنوية
float6464 بتنحو 15 إلى 17 رقمًا معنويًا

الحرفية التي فيها فاصلة عشرية أو أسّ (2.5 و1e6) نوعها float64 افتراضيًا، والحزمة math تأخذ float64 وتعيده. استخدمه ما لم تكن الذاكرة مهمّة في مصفوفة كبيرة.

الأعداد العشرية ثنائية، لذا فمعظم الكسور العشرية تقريبية:

ينتج عن ذلك قاعدتان. لا تقارن الأعداد العشرية بـ == بعد العمليات الحسابية. ولا تخزّن المال في عدد عشري أبدًا: استخدم عددًا صحيحًا من السنتات، أو مكتبة أعداد عشرية.

قسمة عدد عشري على صفر تعطي +Inf أو -Inf أو NaN بدل panic. أما قسمة عدد صحيح على صفر فتسبّب panic وقت التشغيل (runtime error: integer divide by zero)، والقاسم الصفري الثابت خطأ ترجمة.

القيم المنطقية

يحمل bool القيمة true أو false، وقيمته الصفرية false. لا تعامل Go الأرقام أو النصوص الفارغة أو nil كقيم منطقية. if count {} خطأ ترجمة؛ اكتب if count > 0 {}. المعاملات هي && و|| و!، و&& و|| تتوقّفان مبكرًا عند حسم النتيجة.

النصوص

الـ string سلسلة غير قابلة للتعديل من البايتات، وعادة ما تكون نصًا بترميز UTF-8. تعدّ len(s) البايتات لا الأحرف:

يشغل é بايتين في UTF-8، لذا يبلغ len عن 6 لخمسة أحرف. النصوص بين علامتي اقتباس مزدوجتين تعالج رموز الهروب مثل \n؛ أما النصوص الخام بين علامتي الاقتباس المائلتين فلا تعالجها، ويمكن أن تمتد على عدة أسطر. صفحة النصوص تشرح الحزمة strings، وصفحة الـ runes والبايتات تشرح UTF-8 بالتفصيل.

byte وrune

الاسم البديليساوييحمل
byteuint8بايتًا واحدًا من البيانات الخام
runeint32نقطة رمز Unicode واحدة

هذه أسماء بديلة لا أنواع جديدة: byte وuint8 قابلان للتبادل دون تحويل. الأسماء تقول ما يعنيه الرقم.

الأعداد المركّبة

لدى Go أنواع مركّبة مدمجة، complex64 وcomplex128، مع real وimag والحزمة math/cmplx:

برامج قليلة تحتاجها، لكن معالجة الإشارات وبعض الشيفرات العددية تحتاجها.

الأنواع المركّبة والمرجعية

تتجمّع الأنواع الأساسية في أنواع مركّبة. لكل منها صفحته:

النوعمثالالقيمة الصفرية
مصفوفة[3]intثلاثة أصفار
شريحة[]intnil
خريطةmap[string]intnil
بنيةstruct{ X, Y int }كل حقل بقيمته الصفرية
مؤشر*intnil
دالةfunc(int) intnil
قناةchan intnil
واجهةerror، anynil

any اسم بديل لـ interface{} (منذ Go 1.18) ويمكنه حمل قيمة من أي نوع.

الأنواع المسمّاة

يمكنك تعريف نوع جديد من نوع موجود. له التمثيل نفسه لكنه نوع مستقل، ويمكن أن تكون له توابع:

type Celsius float64
type UserID int64

var t Celsius = 21.5
var f float64 = t // compile error: cannot use t (variable of float64 type Celsius) as float64 value in variable declaration

هذه الصرامة مقصودة: لا يمكن تمرير UserID بالخطأ حيث يُتوقَّع OrderID. حوّل صراحة عندما تقصد ذلك: float64(t). راجع صفحة تحويل الأنواع للقواعد ودوال strconv للتنقّل بين الأرقام والنصوص.

القيم الصفرية

لكل نوع قيمة صفرية، وهي ما يحمله المتغيّر قبل أن تسند إليه شيئًا: 0 للأرقام، وfalse لـ bool، و"" للنصوص، وnil للمؤشرات والشرائح والخرائط والقنوات والدوال والواجهات. لا توجد متغيّرات غير مهيّأة في Go.

الأسئلة الشائعة

ما حجم int في Go؟

حجم int وuint هو 64 بت على المنصّات ذات 64 بت (amd64 وarm64) و32 بت على المنصّات ذات 32 بت. إذا احتجت حجمًا ثابتًا، لصيغة ملف أو بروتوكول شبكة، فاستخدم int32 وint64 وuint8 وما شابهها. أما للعدّادات والفهارس والأطوال العادية فاستخدم int.

كيف أطبع نوع متغيّر في Go؟

استخدم الفعل %T: تطبع fmt.Printf("%T\n", x) قيمًا مثل int وfloat64 و[]string وmain.User. وفي الشيفرة تعيد reflect.TypeOf(x) المعلومة نفسها كقيمة يمكنك فحصها.

ما الفرق بين byte وrune في Go؟

byte اسم بديل لـ uint8 ويحمل بايتًا واحدًا من البيانات الخام. وrune اسم بديل لـ int32 ويحمل نقطة رمز Unicode واحدة. النص سلسلة من البايتات؛ والمرور عليه بـ for range يفكّ ترميزه إلى runes.

هل أستخدم float32 أم float64 في Go؟

استخدم float64 ما لم يكن لديك سبب لغير ذلك. فهو النوع الافتراضي للحرفيات العشرية، والنوع الذي تعمل به الحزمة math، ودقته نحو 15 إلى 17 رقمًا عشريًا معنويًا مقابل نحو 6 إلى 9 لـ float32. اختر float32 فقط لتقليص الذاكرة إلى النصف في المصفوفات الكبيرة أو لمطابقة صيغة خارجية.

ما هي القيمة القصوى لـ int في Go؟

استخدم الثوابت في الحزمة math: math.MaxInt (9223372036854775807 على المنصّات ذات 64 بت) وmath.MinInt وmath.MaxInt64 وmath.MaxUint32 وغيرها. العمليات الحسابية التي تتجاوز الحد تلتفّ بصمت وقت التشغيل؛ ولا تسبّب panic.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن