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

ما هي لغة Go (Golang)؟ شرح لغة البرمجة مع أمثلة

لغة Go (وتُسمّى غالبًا Golang) لغة مترجمة ذات أنواع ثابتة صُمّمت في Google لبناء خوادم وأدوات سريعة وموثوقة. تشرح هذه الصفحة ما هي، وفيم تُستخدم، وأين تقصر.

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

Go لغة برمجة مترجمة ذات أنواع ثابتة أُنشئت في Google. تنتج ملفًا تنفيذيًا أصليًا واحدًا، وتُترجم في ثوانٍ، وفيها جمع نفايات، والتزامن مدمج في اللغة عبر الـ goroutines والقنوات. موطنها الأساسي برمجيات الخوادم: الواجهات البرمجية، وخدمات الشبكة، وأدوات سطر الأوامر والسحابة التي تشغّلها.

هذا برنامج Go كامل. اضغط Run.

يبدأ كل برنامج Go في package main عند func main(). تعرّف := متغيّرًا وتستنتج نوعه (هنا []string، أي شريحة من النصوص). تمشي range على الشريحة وتعطيك فهرسًا وقيمة. وتأتي fmt وstrings من المكتبة القياسية، وهي كبيرة بما يكفي لتستغني برامج كثيرة عن استيراد أي شيء آخر.

Go مقابل Golang: الاسم

اسم اللغة Go. و"Golang" لقب جاء من أول موقع للمشروع، golang.org (والموقع الآن على go.dev). واستمر الناس في استخدامه لأن البحث على الويب عن "go" يعيد كل شيء إلا اللغة. يقول التوثيق الرسمي "Go"، لكن "golang" هو المصطلح الذي يكتبه الجميع تقريبًا في مربّع البحث، والاسمان يعنيان الشيء نفسه. لا يوجد منتج أو لهجة منفصلة اسمها "Golang".

من صنع Go ولماذا

بدأ Robert Griesemer وRob Pike وKen Thompson تصميم Go في Google عام 2007. أُطلقت مفتوحة المصدر في نوفمبر 2009، وصدرت Go 1.0 في مارس 2012.

كان الدافع عمليًا. قواعد شيفرة C++ وJava الكبيرة في Google كانت تستغرق وقتًا طويلًا في البناء، وكان من الصعب إدارة رسوم الاعتماديات، وكانت الأجهزة متعدّدة الأنوية والخدمات الشبكية هي القاعدة بينما كانت كتابة الشيفرة المتزامنة معرّضة للأخطاء. يجيب تصميم Go عن هذه المشكلات مباشرة:

  • بناء سريع. الاستيرادات صريحة، والاستيرادات غير المستخدمة خطأ ترجمة، ولا يعيد المترجم تحليل ملفات الترويسات، فتُبنى البرامج الكبيرة في ثوانٍ.
  • لغة بسيطة. كلمات مفتاحية قليلة، وحلقة واحدة (for)، ولا وراثة، ولا استثناءات. الشيفرة التي يكتبها أشخاص مختلفون تميل إلى أن تتشابه، وهذا يساعد المراجعات في فريق كبير.
  • التزامن ميزة في اللغة. تشغيل مهمة متزامنة كلمة مفتاحية واحدة، go، والقنوات تتيح للمهام التواصل.
  • نشر سهل. المخرجات ملف تنفيذي واحد تنسخه إلى خادم. وعادة يكون مربوطًا ربطًا ساكنًا؛ ومع تفعيل cgo يمكن لحزم مثل net الارتباط بمكتبة C في النظام، ويعطّل CGO_ENABLED=0 ذلك.

جاءت Go 1.0 أيضًا مع وعد التوافق في Go 1: البرامج المكتوبة لـ Go 1.0 تستمر في الترجمة والعمل مع إصدارات 1.x اللاحقة. عمليًا يعني ذلك أن ترقية الأدوات نادرًا ما تكسر شيفرتك، وهذا سبب كبير لثقة الفرق بـ Go للخدمات طويلة العمر.

فيم تُستخدم Golang

تكون Go في أقوى حالاتها حيث يتحدّث البرنامج إلى شبكة، ويعمل لفترة طويلة، ويجب أن يكون سهل الشحن:

المجالأمثلة
واجهات الويب البرمجية والخدمات المصغّرةخدمات HTTP وgRPC، وخلفيات تطبيقات الويب والجوال
أدوات السحابة والبنية التحتيةDocker وKubernetes وTerraform وPrometheus
أدوات سطر الأوامرأدوات المطوّرين التي تُشحن كملف تنفيذي واحد لكل منصّة
الشبكاتالوسطاء، وموازنات الحمل، وخوادم DNS
خطوط البياناتعمّال يقرؤون الطوابير، ويحوّلون السجلات، ويكتبون في قواعد البيانات

وهي أقل ملاءمة لتطبيقات سطح المكتب الرسومية، وتطبيقات الجوال، وواجهات المتصفّح الأمامية، والعمل العددي أو تعلّم الآلة، حيث تملك منظومات أخرى مكتبات أفضل بكثير.

الميزات الأساسية، مع الشيفرة

أنواع ثابتة مع استنتاج

لكل متغيّر نوع ثابت وقت الترجمة، لكنك نادرًا ما تكتبه. تستنتجه :=:

لا تحوّل Go أبدًا بين الأنواع الرقمية بصمت. لا تُترجم count * price، لأن أحدهما int والآخر float64؛ فتكتب float64(count) بنفسك. وهذا يستبعد أخطاء الاقتطاع والدقة الصامتة.

الأخطاء قيم

لا تملك Go استثناءات. الدالة التي قد تفشل تعيد error كآخر نتيجة، ويفحصها المستدعي:

نمط if err != nil أشهر سطر في شيفرات Go. إنه مطوّل، وهذا هو المقصود: كل مكان قد يفشل فيه البرنامج ظاهر حيث يحدث. راجع معالجة الأخطاء لتغليف الأخطاء وفحصها.

الـ goroutines والقنوات

الـ goroutine دالة تعمل بالتزامن مع بقية البرنامج. تكلّف بضعة كيلوبايتات من المكدّس، فتشغيل الآلاف منها أمر عادي. وتنقل القنوات القيم بين الـ goroutines بأمان:

تعمل الـ goroutines الثلاث بالتزامن، فقد تُطبع الأسطر الثلاثة بأي ترتيب. شغّله بضع مرات وقد ترى ترتيبات مختلفة. تستقبل main ثلاث قيم بالضبط، فتنتظرها كلها قبل الخروج.

واجهات دون "implements"

يحقّق النوع الواجهة بمجرّد امتلاكه التوابع الصحيحة. لا توجد كلمة implements:

لا يذكر Rect ولا Circle الواجهة Shape، ومع ذلك يمكن تخزين كليهما في []Shape. وهذا يتيح لك تعريف واجهة في الحزمة التي تستخدمها، بعد وقت طويل من كتابة الأنواع المحدّدة.

أدوات واحدة

يفعل الأمر go كل شيء: go run يترجم ويشغّل، وgo build يصنع ملفًا تنفيذيًا، وgo test يشغّل الاختبارات، وgo fmt ينسّق الشيفرة، وgo vet يلتقط البنى المريبة، وgo mod يدير الاعتماديات. هناك أسلوب تنسيق رسمي واحد يفرضه gofmt، فلا تتجادل مشاريع Go حول الأقواس أو الإزاحة.

ما تتركه Go عن قصد

بعض الميزات الشائعة في لغات أخرى غائبة عمدًا:

  • لا أصناف ولا وراثة. تستخدم البنى والتوابع والواجهات والتضمين.
  • لا استثناءات. الأخطاء قيم معادة. توجد panic، لكنها للأخطاء البرمجية، لا للإخفاقات العادية.
  • لا معامل ثلاثي. تكتب if/else.
  • لا كلمة while. تغطّي for كل حلقة.
  • لا تحميل زائد للدوال ولا وسائط افتراضية.
  • الأنواع العامة فقط منذ Go 1.18، ومحدودة عمدًا مقارنة بقوالب C++ أو الأنواع العامة في Java.

مقايضات بصدق

الإطالة. فحوص الأخطاء الصريحة وغياب الاختصارات مثل المعامل الثلاثي تجعل شيفرة Go أطول من مكافئتها في Python أو Kotlin. قراءتها سهلة؛ وكتابتها تأخذ أسطرًا أكثر.

جمع النفايات. لجامع Go أوقات توقّف قصيرة، لكنه يبقى جامع نفايات. لأنظمة الزمن الحقيقي الصارمة أو الشيفرة التي يهمّ فيها كل حجز للذاكرة، تعطيك C أو C++ أو Rust تحكّمًا أكبر.

قيم nil. لدى Go مؤشرات وخرائط وشرائح وواجهات قيمتها nil. إلغاء مرجعية مؤشر nil حالة panic وقت التشغيل، ولا يمنعها المترجم كما يفعل نظام أنواع Rust.

نظام أنواع صغير. لا أنواع مجموع (sum types)، ولا تعدادات (تبنيها بالثوابت وiota)، وأنواع عامة تغطّي الحالات الشائعة لكن ليس البرمجة المتقدّمة على مستوى الأنواع.

فجوات في المنظومة. المكتبات لخدمات الويب وقواعد البيانات والواجهات السحابية ممتازة. أما للواجهات الرسومية والحوسبة العلمية وتعلّم الآلة فلدى Python أو C++ أو Julia أكثر بكثير.

Go مقارنة بلغات أخرى

GoPythonJavaRust
الأنواعثابتةديناميكيةثابتةثابتة
تعمل كـملف تنفيذي أصليمفسّرشيفرة بايت JVMملف تنفيذي أصلي
الذاكرةجمع نفاياتجمع نفاياتجمع نفاياتالملكية، دون GC
التزامنgoroutines وقنواتخيوط وasyncio (الـ GIL يحدّ توازي المعالج)خيوط وخيوط افتراضيةخيوط وasync
منحنى التعلّممنخفضمنخفضمتوسّطمرتفع

اختر Go عندما تريد أداء اللغات المترجمة ونشرًا بسيطًا دون منحنى تعلّم Rust أو رسميات Java.

هل تستحق Go التعلّم؟

إذا كنت تكتب خدمات خلفية، أو أدوات سطر أوامر، أو أي شيء في مجال البنية التحتية السحابية، فنعم. Go هي اللغة التي كُتب بها كثير من تلك المنظومة، وقراءة مصادرها جزء من العمل. اللغة صغيرة، فالاستثمار متواضع: الصياغة الأساسية تأخذ أيامًا، والتزامن ومعالجة الأخطاء بالأسلوب المعتاد يأخذان بضعة أسابيع من الممارسة.

لتبدأ كتابة Go محليًا، ثبّت Go، ثم اعمل على صفحة hello world، التي تشرح كل سطر من أول برنامج.

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

فيم تُستخدم Golang؟

في الغالب لبرمجيات الخلفية والبنية التحتية: خوادم الويب والواجهات البرمجية، والخدمات المصغّرة، وأدوات سطر الأوامر، وشيفرات الشبكات، وأدوات السحابة. Docker وKubernetes وTerraform وPrometheus كلها مكتوبة بـ Go. ونادرًا ما تُستخدم لواجهات سطح المكتب الرسومية أو تطبيقات الجوال أو علم البيانات.

هل Go هي نفسها Golang؟

نعم. اسم اللغة Go. جاء اسم "Golang" من عنوان الموقع الأصلي، golang.org، وبقي لأن كلمة "go" صعبة البحث. الاسمان يشيران إلى اللغة نفسها والأدوات نفسها.

من أنشأ لغة البرمجة Go؟

صمّم Robert Griesemer وRob Pike وKen Thompson لغة Go في Google بدءًا من 2007. أُعلن عنها مفتوحة المصدر في نوفمبر 2009، وصدرت Go 1.0، الإصدار الذي بدأ وعد التوافق في Go، في مارس 2012.

هل تعلّم Go سهل؟

اللغة نفسها صغيرة: 25 كلمة مفتاحية، وبنية حلقة واحدة، ومواصفة قصيرة يمكنك قراءتها في فترة ما بعد الظهر. معظم المبرمجين ذوي الخبرة في لغة أخرى يكتبون شيفرة Go تعمل خلال أيام. الأجزاء التي تأخذ وقتًا أطول هي الأعراف: معالجة الأخطاء الصريحة، والواجهات، وكتابة شيفرة متزامنة صحيحة بالـ goroutines والقنوات.

هل Go لغة مترجمة أم مفسّرة؟

مترجمة. ينتج go build ملفًا تنفيذيًا بشيفرة الآلة الأصلية دون اعتماد على مفسّر أو آلة افتراضية. وgo run يترجم أيضًا؛ لكنه يبني في مكان مؤقّت ويشغّل النتيجة.

Coddy programming languages illustration

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

ابدأ الآن