أنواع البيانات في لغة Go: شرح مفصل وشامل
تعتبر لغة Go (المعروفة أيضاً باسم Golang) من لغات البرمجة الحديثة التي تم تطويرها بواسطة شركة Google، والتي تتميز بالسرعة والكفاءة والقدرة على التعامل مع البرمجة الموزعة والتزامن بشكل متميز. واحدة من أهم الركائز التي تعتمد عليها أي لغة برمجة هي نوع البيانات، حيث تلعب دورًا جوهريًا في كيفية تخزين المعلومات ومعالجتها. في هذا المقال سنغوص في تفاصيل أنواع البيانات المختلفة التي توفرها لغة Go، مع توضيح طبيعتها واستخداماتها وكيفية التعامل معها بشكل فعّال في البرامج المختلفة.
مقدمة عامة عن نظام أنواع البيانات في Go
لغة Go تعتمد على نظام أنواع بيانات صارم static typing system، ما يعني أن كل متغير يجب أن يعرف نوعه بشكل واضح عند التصريح عنه، مما يساهم في تقليل الأخطاء البرمجية ويساعد في تحسين أداء البرنامج من خلال تخصيص الموارد المناسبة لكل نوع. كما توفر اللغة قدرات تسمح بتحويل البيانات بين الأنواع المختلفة في حالات محددة، مع الحفاظ على سلامة البرنامج.
أنواع البيانات في Go تُصنف بشكل عام إلى الأنواع الأساسية (Primitive types)، وأنواع البيانات المركبة (Composite types)، وأنواع البيانات المخصصة (User-defined types).
الأنواع الأساسية (Primitive Types) في Go
1. الأنواع العددية (Numeric Types)
تُعتبر الأنواع العددية من أكثر الأنواع استخدامًا في جميع لغات البرمجة، وتوفر لغة Go تنوعًا كبيرًا في أنواع الأعداد لضبط الدقة ومساحة التخزين.
أ) الأعداد الصحيحة (Integers)
تنقسم الأعداد الصحيحة إلى عدة أنواع حسب حجم البيانات التي تخزنها:
-
int: هو النوع الأساسي للأعداد الصحيحة والذي يعتمد حجمه على نظام التشغيل (32 بت في الأنظمة 32-بت و64 بت في الأنظمة 64-بت).
-
int8: عدد صحيح بحجم 8 بت (1 بايت)، القيم الممكنة من -128 إلى 127.
-
int16: عدد صحيح بحجم 16 بت، القيم الممكنة من -32,768 إلى 32,767.
-
int32: عدد صحيح بحجم 32 بت.
-
int64: عدد صحيح بحجم 64 بت، يستخدم لتخزين أعداد كبيرة.
-
uint8 (يُعرف أيضاً بـ byte): عدد صحيح غير موقع بحجم 8 بت، القيم من 0 إلى 255.
-
uint16، uint32، uint64: أعداد صحيحة غير موقع بحجم 16، 32، و64 بت على التوالي.
ب) الأعداد العشرية (Floating-point Numbers)
تُستخدم لتمثيل الأعداد التي تحتوي على جزء عشري، وتدعم Go نوعين رئيسيين:
-
float32: عدد عشري بدقة 32 بت.
-
float64: عدد عشري بدقة 64 بت، وهو النوع الافتراضي عند استخدام الأعداد العشرية في Go.
ج) الأعداد المركبة (Complex Numbers)
تدعم Go الأعداد المركبة التي تتكون من جزء حقيقي وجزء تخيلي، مع نوعين رئيسيين:
-
complex64: مكونة من float32 للجزء الحقيقي والتخيلي.
-
complex128: مكونة من float64 للجزء الحقيقي والتخيلي.
2. النوع البولياني (Boolean)
-
bool: يستخدم لتمثيل القيمتين الحقيقتين:
trueأوfalse. هذا النوع ضروري في التحكم في تدفق البرنامج مثل شروط if وloops.
3. النوع النصي (String)
-
string: يستخدم لتمثيل النصوص، وهو في Go عبارة عن سلسلة من الأحرف Unicode. تتميز الـ string في Go بأنها غير قابلة للتغيير (immutable)، مما يعني أنه لا يمكن تعديل النص مباشرة بعد إنشائه، ولكن يمكن إنشاء نصوص جديدة مبنية على النصوص القديمة.
الأنواع المركبة (Composite Types) في Go
توفر لغة Go عدة أنواع مركبة تسمح بجمع أكثر من قيمة تحت نفس النوع، مما يسهل التعامل مع مجموعات من البيانات.
1. المصفوفات (Arrays)
المصفوفة هي مجموعة من العناصر من نفس النوع مخزنة في مواقع متجاورة في الذاكرة. تُعرّف بحجم ثابت يجب تحديده عند الإعلان عنها.
مثال على تعريف مصفوفة:
govar arr [5]int
يتم استخدام المصفوفات عندما يكون عدد العناصر معروفًا وثابتًا.
2. الشرائح (Slices)
الشرائح في Go هي بنية أكثر مرونة من المصفوفات، حيث تمثل جزءًا من مصفوفة أو مجموعة من العناصر قابلة للتغيير في الحجم. الشرائح هي النوع الأكثر استخدامًا عند التعامل مع مجموعات البيانات الديناميكية.
يمكن تعريف شريحة هكذا:
govar s []int
ميزة الشرائح أنها توفر سهولة في الإضافة والحذف مقارنة بالمصفوفات.
3. الخرائط (Maps)
الخرائط هي بنية بيانات تمثل مجموعة من الأزواج مفتاح-قيمة، حيث يمكن الوصول إلى القيم عبر المفاتيح الفريدة.
مثال على تعريف خريطة:
govar m map[string]int
الخرائط في Go تستخدم لتخزين واسترجاع البيانات بسرعة بناءً على المفاتيح.
4. القنوات (Channels)
تعتبر القنوات من أهم ميزات Go في التعامل مع البرمجة المتزامنة (concurrency)، وتستخدم لنقل البيانات بين goroutines (الوحدات الخفيفة التنفيذ).
تعريف قناة:
govar ch chan int
تساعد القنوات في مزامنة تبادل البيانات بين العمليات المتزامنة بطريقة آمنة.
الأنواع المعرفة من قبل المستخدم (User-defined Types)
يمكن للمبرمجين في Go إنشاء أنواعهم الخاصة بناءً على الأنواع الأساسية والمركبة.
1. الأنواع المعرفة (Type Definitions)
تسمح لغة Go بإنشاء أنواع جديدة بناءً على أنواع موجودة، ما يضيف وضوحًا ويعزز القابلية لإعادة الاستخدام.
مثال:
gotype Age int
2. الهياكل (Structs)
الهياكل هي مجموعات من الحقول التي يمكن أن تكون بأنواع مختلفة، وتستخدم لبناء أنواع بيانات معقدة.
مثال على تعريف هيكل:
gotype Person struct {
Name string
Age int
}
الهياكل هي العمود الفقري لإنشاء نماذج بيانات منظمة في Go.
3. الواجهات (Interfaces)
الواجهات تحدد مجموعة من الدوال التي يجب أن تحققها أي نوع يطبق هذه الواجهة، وتدعم البرمجة التجريدية (abstraction).
مثال:
gotype Reader interface {
Read(p []byte) (n int, err error)
}
الأنواع الخاصة والإضافية في Go
1. النوع الفارغ (Empty Interface)
-
interface{}هو نوع خاص يمثل أي قيمة في Go، يستخدم عندما لا يكون نوع البيانات معروفًا مسبقًا.
2. المؤشرات (Pointers)
تشير إلى موقع في الذاكرة حيث تُخزن قيمة معينة، وتتيح تعديل القيم في مواقع الذاكرة مباشرة.
مثال:
govar p *int
جدول مقارنة بين أنواع البيانات الأساسية في Go
| النوع | الحجم (بت) | المجال القيمي | الاستخدام النموذجي |
|---|---|---|---|
| int | 32 أو 64 | يعتمد على النظام | الأعداد الصحيحة العامة |
| int8 | 8 | -128 إلى 127 | أعداد صغيرة الحجم |
| int16 | 16 | -32,768 إلى 32,767 | أعداد صغيرة ومتوسطة |
| int32 | 32 | -2,147,483,648 إلى 2,147,483,647 | أعداد متوسطة |
| int64 | 64 | -9,223,372,036,854,775,808 إلى 9,223,372,036,854,775,807 | أعداد كبيرة |
| uint8 | 8 | 0 إلى 255 | تمثيل بايت أو بيانات غير سالبة |
| uint16 | 16 | 0 إلى 65,535 | أعداد غير سالبة متوسطة |
| uint32 | 32 | 0 إلى 4,294,967,295 | أعداد غير سالبة كبيرة |
| uint64 | 64 | 0 إلى 18,446,744,073,709,551,615 | أعداد غير سالبة جداً كبيرة |
| float32 | 32 | الأعداد العشرية بدقة منخفضة | الحسابات العشرية ذات الدقة المنخفضة |
| float64 | 64 | الأعداد العشرية بدقة عالية | الحسابات العشرية بدقة عالية |
| complex64 | 64 | أعداد مركبة باستخدام float32 | الرياضيات المعقدة |
| complex128 | 128 | أعداد مركبة باستخدام float64 | الرياضيات المعقدة العالية الدقة |
| bool | 1 | true أو false | الشروط المنطقية |
| string | متغير | سلسلة من الأحرف Unicode | تمثيل النصوص |
الخلاصة
لغة Go تقدم نظامًا متكاملًا ومتعددًا لأنواع البيانات، من الأنواع الأساسية التي تتضمن الأعداد، الأحرف، والقيم البوليانية، إلى الأنواع المركبة التي تسمح بالتعامل مع مجموعات بيانات معقدة ومرنة، بالإضافة إلى إمكانية إنشاء أنواع مخصصة تسمح ببناء برامج قوية ومنظمة. فهم هذه الأنواع واستغلالها بشكل صحيح يمكّن المبرمج من كتابة برامج فعالة، نظيفة، وسهلة الصيانة، ويعزز من القدرة على التعامل مع تحديات البرمجة الحديثة خاصة في بيئات البرمجة المتزامنة والمتوازية.
المراجع
-
الوثائق الرسمية للغة Go: https://golang.org/ref/spec#Types
-
كتاب “The Go Programming Language” لـ Alan A. A. Donovan و Brian W. Kernighan

