🐹 مرجع Go بالعربي
كل كلمة مفتاحية ودالة مدمجة ودالة قياسية في Go بالعربي: ماذا تفعل، صياغتها، مثال يوضّحها، وأشهر الأخطاء — لغة مُترجَمة فلا يوجد تشغيل حي في المتصفح. حاليًا 34 عنصر — والقائمة تكبر.
أساسيات اللغة
func
تعريف الدوال
func تعرّف دالة في Go — تدعم إعادة أكثر من قيمة دفعة واحدة، وتسمية قيم الإعادة مسبقًا داخل التوقيع نفسه.
defer
تأجيل التنفيذ حتى العودة
defer يجدول استدعاء دالة لينفَّذ مباشرة قبل عودة الدالة المحيطة — الأداة القياسية لضمان التنظيف (إغلاق ملف، فكّ قفل...) مهما كان مسار الخروج.
go
تشغيل goroutine
بادئة الاستدعاء بكلمة go تشغّل الدالة في goroutine جديدة تعمل بالتوازي دون انتظار انتهائها.
select
الاختيار بين عدّة قنوات
select يجعل الكود ينتظر أكثر من عملية قناة في نفس الوقت، وينفّذ أول حالة تصبح جاهزة.
range
المرور على العناصر
range يمرّ على عناصر شريحة أو خريطة أو نص أو قناة بصيغة موحّدة، ويعيد قيمتين مختلفتي المعنى حسب النوع.
الدوال المدمجة
make
تخصيص الشرائح والخرائط والقنوات
make دالة مدمجة تخصّص وتهيّئ شريحة أو خريطة أو قناة جاهزة للاستخدام مباشرة — بعكس new التي تعيد مؤشّرًا لقيمة صفرية فقط.
append
الإضافة لنهاية شريحة
append دالة مدمجة تضيف عنصرًا أو أكثر لنهاية شريحة، وتعيد الشريحة المحدَّثة التي يجب حفظها دائمًا.
panic
إيقاف التنفيذ الفوري
panic تُوقف التنفيذ الطبيعي للدالة الحالية فورًا وتبدأ سلسلة عودة عبر كل دالة مستدعية، منفّذة أي defer بالطريق، حتى تُلتقط بـ recover أو ينتهي البرنامج.
recover
التقاط panic والتعافي منه
recover تلتقط panic جاريًا وتوقف سلسلة الإنهاء، لتعيد البرنامج للتنفيذ الطبيعي بدل الانهيار الكامل — لكنها تعمل فقط داخل دالة مؤجَّلة بـ defer.
المكتبة القياسية
context.WithTimeout
مهلة زمنية لعملية
context.WithTimeout تشتق من context أب مهلةً زمنية نسبية — تُلغى القناة Done تلقائيًا عند انقضاء المدة أو عند استدعاء cancel يدويًا، أيّهما أسبق.
os.ReadFile
قراءة ملف كامل دفعة واحدة
os.ReadFile يقرأ محتوى ملف كاملًا من مساره ويعيده كشريحة بايتات — أبسط طريقة لقراءة ملف صغير أو متوسّط الحجم في Go.
strings.Split
تقسيم نص لأجزاء
strings.Split يقسّم نصًّا لشريحة من الأجزاء بناءً على فاصل محدَّد، مع سلوك خاص عند غياب الفاصل أو كونه فارغًا.
ServeMux Patterns
أنماط توجيه الميثود والمسار في ServeMux
منذ Go 1.22، تدعم أنماط http.ServeMux مطابقة الميثود والـ wildcards داخل النمط نفسه، فتنتهي الحاجة لفحص r.Method أو تقطيع المسار يدويًا.
Request.PathValue
قراءة قيمة wildcard من المسار
PathValue تُرجع قيمة الجزء المطابق لـ wildcard بنمط ServeMux المسجَّل، بدل استخراجها يدويًا من r.URL.Path بتقطيع النص.
slices.Collect
تجميع تكرار داخل شريحة جديدة
slices.Collect يأخذ iter.Seq[V] ويجمع كل القيم الناتجة عنه داخل شريحة []V جديدة — الجسر بين عالم التكرارات الكسولة والشرائح العادية.
slices.Sorted
تجميع تكرار وفرزه دفعة واحدة
slices.Sorted يجمع قيم iter.Seq[E] داخل شريحة جديدة ثم يفرزها مباشرة — اختصار عملي بديل لاستخراج المفاتيح يدويًا ثم استدعاء sort.
os.Root
وصول لنظام الملفات محصور بمجلّد
os.Root يمنح وصولًا لنظام الملفات محصورًا داخل شجرة مجلّد واحد فقط — أي مسار يحاول الهروب منها، حتى عبر رابط رمزي symlink، يفشل بخطأ بدل الوصول لملف خارج الحدود المقصودة.
weak.Pointer
مؤشّر ضعيف لا يمنع تحرير الذاكرة
weak.Pointer يشير لقيمة دون منع جامع القمامة من تحريرها — مفيد لبناء ذواكر تخزين مؤقّت (caches) لا تُبقي كائنات حيّة بالذاكرة لمجرّد وجودها بالكاش.
synctest.Test
تشغيل اختبار داخل فقاعة زمن وهمي
synctest.Test يشغّل دالة اختبار داخل فقاعة (bubble) بساعة وهمية تتقدّم فورًا لا بالوقت الحقيقي — فيصبح اختبار كود يستخدم time.Sleep أو مُهلًا زمنية سريعًا وحتميًّا بدل بطيء وغير مستقرّ.
synctest.Wait
الانتظار حتى تتوقّف كل الـ goroutines داخل الفقاعة
synctest.Wait تحجب حتى تصل كل goroutine أخرى داخل نفس الفقاعة لحالة حجب دائم — أداة تزامن صريحة داخل اختبارات synctest بدل انتظارات تخمينية أو Sleep قصير.
jsonv2.Marshal
تحويل قيمة إلى JSON (النسخة الثانية)
jsonv2.Marshal من حزمة encoding/json/v2 الجديدة (منذ Go 1.27) تحوّل قيمة Go إلى JSON بنفس فكرة json.Marshal القديمة، لكن بقواعد أدقّ وخيارات Options اختيارية — الحزمة القديمة تبقى مدعومة بالكامل.
jsonv2.Unmarshal
تحويل JSON إلى قيمة (النسخة الثانية)
jsonv2.Unmarshal من encoding/json/v2 تقرأ JSON لقيمة Go بقواعد أدقّ من النسخة الأولى: ترفض UTF-8 غير صالح وترفض تكرار نفس المفتاح بدل تجاهلهما بصمت، وأداؤها أسرع ملحوظًا.
uuid.New / uuid.NewV7
توليد UUID جديد
الحزمة القياسية الجديدة uuid (منذ Go 1.27) تولّد UUID بلا مكتبة خارجية — uuid.New لأي غرض عام (نسخة v4 عشوائية)، و uuid.NewV7 لمعرّف مرتّب زمنيًا يناسب مفاتيح قواعد البيانات.
uuid.Parse
تحليل نص UUID
uuid.Parse من الحزمة القياسية uuid تحوّل نصًّا يمثّل UUID (بأي صيغة شائعة: بشرطات، بأقواس، أو urn:uuid:) إلى قيمة UUID، مع error واضح عند فشل التحليل.
bytes.CutLast
تقطيع بايتات عند آخر ظهور لفاصل
bytes.CutLast (منذ Go 1.27) تقطّع شريحة بايتات عند آخر ظهور لفاصل محدَّد، معاكسة لـ bytes.Cut التي تقطع عند أول ظهور — تبسّط حالات شائعة كانت تحتاج LastIndex يدويًا.
strings.CutLast
تقطيع نص عند آخر ظهور لفاصل
strings.CutLast (منذ Go 1.27) تقطّع نصًّا عند آخر ظهور لفاصل محدَّد — معاكسة لـ strings.Cut التي تقطع عند أول ظهور، وتختصر حالات كانت تحتاج LastIndex يدويًا.
runtime/pprof goroutineleak
اكتشاف goroutines متسرّبة للأبد
ملف تعقّب goroutineleak بحزمة runtime/pprof (تجريبي منذ Go 1.26، جاهز للإنتاج منذ Go 1.27) يكتشف goroutines عالقة للأبد على قناة أو Mutex لن يتحرّر أبدًا — يعتمد على قابلية الوصول (reachability) لا مجرّد مهلة زمنية.
ميزات حديثة
range over func (iter.Seq)
المرور على دالة تكرارية مخصّصة
منذ Go 1.23، range تقبل دالة تطابق توقيع iter.Seq[V] مباشرة، فتصبح كتابة تكرارات (iterators) مخصّصة قابلة للاستخدام بنفس صيغة range العادية.
iter.Seq2
تكرار بأزواج قيم (مفتاح وقيمة)
iter.Seq2[K, V] نفس فكرة iter.Seq لكن بزوج قيم لكل خطوة — الصيغة التي تستخدمها maps.All وslices.All لإرجاع مفتاح أو فهرس مع القيمة معًا.
Generic Type Alias
أليس نوع بمعامل عام
منذ Go 1.24، يمكن لأليس نوع (type alias) أن يحمل معامل نوع خاصًّا به مثل نوع معرَّف عادي — اسم مختصر لنوع عام متكرّر دون إنشاء نوع منفصل جديد.
new(expr)
مؤشّر لقيمة مهيَّأة بخطوة واحدة
منذ Go 1.26، new تقبل تعبيرًا (قيمة) لا نوعًا فقط — فتخصّص متغيّرًا مهيَّأً بتلك القيمة مباشرة وتعيد مؤشّره، بخطوة واحدة بدل متغيّر مؤقّت ثم أخذ عنوانه بـ &.
func (T) M[P any](...)
method يعلن معامل نوع خاص به
منذ Go 1.27، method مفرد يقدر يعلن معامل نوع خاص به بين اسمه وقائمة معاملاته — حتى لو النوع الذي ينتمي إليه غير عام أصلًا، بلا حاجة لتحويل النوع كله لنوع عام.
Struct{Field: v}
مفتاح struct literal لحقل مُرقّى
منذ Go 1.27، مفتاح عنصر بـ struct literal يقبل أي field selector صالح — يشمل حقلًا مُرقًّى (promoted) من نوع مُضمَّن مباشرة، لا اسم حقل مباشر بالنوع فقط كما كان سابقًا.
أدوات ووحدات Go
🎓 تريد التعلم بالترتيب بدل المرجع السريع؟ ابدأ من مسار GO الكامل بالعربي.