وثائق Go
مرجع موجز ومدعّم بأمثلة للغة Go. اقرأ المفهوم، شاهد الكود، ثم تدرّب عليه في رحلة Coddy.
ابدأ رحلة موجَّهة في Goالبداية
- ما هي Go؟لغة Go (وتُسمّى غالبًا Golang) لغة مترجمة ذات أنواع ثابتة صُمّمت في Google لبناء خوادم وأدوات سريعة وموثوقة. تشرح هذه الصفحة ما هي، وفيم تُستخدم، وأين تقصر.
- تثبيت Goكيف تنزّل Go وتثبّتها على Windows وmacOS وLinux، وتتحقّق من التثبيت بـ go version، وتفهم GOPATH، وتصلح خطأ "go: command not found".
- Hello Worldبرنامج hello world في Go سطرًا بسطر: package main، وكتلة import، وfunc main، وfmt.Println، مع طريقة تشغيله وأخطاء الترجمة الأولى التي يقع فيها المبتدئون.
- go run وgo buildما يفعله كل من go run وgo build وgo install، وكيف تسمّي Go الملف التنفيذي، وكيف تترجم لمنصّات أخرى بـ GOOS وGOARCH، وفحوص go fmt وgo vet التي تشغّلها قبل رفع الشيفرة.
- وحدات Goكيف تعمل وحدات Go (modules): إنشاء وحدة بـ go mod init، اختيار مسار الوحدة، إضافة الاعتماديات بـ go get، التنظيف بـ go mod tidy، الغرض من go.sum، وreplace للتطوير المحلي.
- الحزم والاستيرادكيف تعمل الحزم في Go: عبارة package، استيراد الحزم القياسية وحزم الوحدات، الأسماء المُصدَّرة وغير المُصدَّرة، تقسيم حزمة على عدة ملفات، الحزم الداخلية، الأسماء البديلة للاستيراد، الاستيراد الفارغ، وخطأ "undefined" من go run main.go.
الأساسيات
- المتغيّراتكيف تعرّف المتغيّرات في Go بـ var وبالصيغة المختصرة :=، وما هي القيم الصفرية، والإسناد المتعدّد، وأخطاء التظليل والمتغيّرات غير المستخدمة التي يقع فيها مبرمجو Go الجدد.
- الثوابتكيف تعمل const في Go: تعريف الثوابت، الفرق بين الثوابت ذات النوع وعديمة النوع، التعابير الثابتة بدقة غير محدودة، ولماذا لا تملك Go شرائح أو خرائط أو بنى ثابتة.
- التعدادات وiotaلا تملك Go كلمة enum. تعرض هذه الصفحة البديل المعتاد: نوع مسمّى مع كتلة const تستخدم iota، وكيف تضيف String() والتحقّق والتحليل وأعلام البتات ودعم JSON.
- أنواع البياناتالأنواع المدمجة في Go: أحجام الأعداد الصحيحة ونطاقاتها، float32 وfloat64، bool وstring، byte وrune، الأعداد المركّبة، القيم الصفرية، وكيف تطبع نوع قيمة بـ %T.
- تحويل الأنواعكيف تحوّل بين الأنواع في Go: من int إلى string ومن string إلى int بـ strconv، ومن الأعداد العشرية إلى الصحيحة، والتحويلات الرقمية بـ T(v)، والبايتات والـ runes، وفخ string(65)، ومعالجة أخطاء التحويل.
- النصوصالعمل مع النصوص في Go: الحزمة strings (Split وJoin وContains وReplace وFields وTrimSpace وToUpper)، وبناء النصوص بكفاءة بـ strings.Builder، والنصوص الخام متعدّدة الأسطر، وعدم قابلية التعديل، ولماذا تعدّ len البايتات.
- الـ runes والبايتاتما يعنيه rune وbyte في Go، وكيف تخزّن النصوص UTF-8، ولماذا تعدّ len البايتات، وكيف تفكّ range ترميز الـ runes، والتحويل بين string و[]byte و[]rune، والعمل بالحزمة bytes.
- fmt.Printf وSprintfكيف تطبع الحزمة fmt في Go القيم وتنسّقها: Println مقابل Printf مقابل Sprintf مقابل Errorf، الجدول الكامل لأفعال التنسيق (%v و%+v و%d و%s و%q و%f و%T و%w وغيرها)، والعرض والدقة والحشو.
التحكم في التدفق
- if / elseكيف تعمل if وelse if وelse في Go: دون أقواس، مع أقواس معقوصة إلزامية، وعبارة if مع جزء تهيئة ونطاقه، ونمط if err != nil، والعودة المبكرة بدل التداخل العميق.
- حلقة forلدى Go كلمة حلقة واحدة، for، وهي تغطّي كل شيء: حلقة العدّ بثلاثة أجزاء، وحلقة الشرط فقط (while)، والحلقة اللانهائية، وrange على الشرائح والخرائط والنصوص والقنوات والأعداد الصحيحة والدوال. إضافة إلى break وcontinue مع الوسوم وتغيير متغيّر الحلقة في Go 1.22.
- حلقة whileلا تملك Go كلمة while. حلقة for مع شرط فقط هي حلقة while في Go، وfor دون شرط حلقة لا نهائية، وdo-while حلقة لا نهائية يأتي الفحص في نهايتها.
- حلقات rangeما تعطيه for range للشرائح والمصفوفات والنصوص والخرائط والقنوات والأعداد الصحيحة ودوال المكرِّر، ولماذا يكون متغيّر القيمة نسخة، وماذا يحدث عند تعديل شريحة أو خريطة أثناء المرور عليها، وrange على الدوال في Go 1.23.
- العبارة switchكيف تعمل switch في Go: الحالات لا تنتقل إلى التالية افتراضيًا، والحالة الواحدة يمكن أن تسرد عدة قيم، وswitch دون شرط تحلّ محل سلاسل if/else، وswitch مع عبارة تهيئة، والكلمة fallthrough، ونظرة سريعة على type switch.
- المعامل الثلاثيلا تملك Go معاملًا ثلاثيًا (cond ? a : b). تشرح هذه الصفحة السبب، وتعرض البديل المعتاد بـ if/else، وcmp.Or للقيم الافتراضية، ودالة مساعدة عامة مع الفخ الذي يجعلها تختلف عن معامل ثلاثي حقيقي.
الدوال
- الدوالكيف تعرّف الدوال وتستدعيها في Go: المعاملات، والمعاملات التي تتشارك نوعًا، والقيم المعادة، والتمرير بالقيمة، والدوال كقيم يمكنك تخزينها وتمريرها.
- القيم المعادة المتعدّدةتستطيع دوال Go إعادة عدة قيم. تغطّي هذه الصفحة الصياغة، واصطلاح (value, error)، ونمط comma-ok، والنتائج المسمّاة، والعودة المجرّدة، والمعرّف الفارغ.
- الدوال المتغيّرة العددتقبل الدالة المتغيّرة العدد (variadic) في Go أي عدد من الوسائط الأخيرة من نوع واحد. تعلّم صياغة ...T، وكيف تمرّر شريحة بـ s...، وفخ المشاركة، وكيف تستخدم fmt.Println الصيغة ...any.
- الإغلاقاتتستطيع الدوال المجهولة في Go التقاط متغيّرات من النطاق المحيط بها، وهذا ما يصنع الإغلاقات (closures): عدّادات ومولّدات وطبقات وسيطة ودوال رد نداء تحتفظ بحالتها الخاصة.
- العبارة deferتجدول defer استدعاء يُنفَّذ عند عودة الدالة المحيطة. تعلّم ترتيب LIFO، ومتى تُقيَّم الوسائط، وإغلاق الملفات وفكّ أقفال mutex، وdefer داخل الحلقات، وتعديل النتائج المسمّاة.
- التوابعالتابع (method) دالة لها مستقبِل. تعلّم كيف تعرّف التوابع، ومتى تستخدم مستقبِل قيمة أو مستقبِل مؤشر، ومجموعات التوابع والواجهات، والتوابع على الأنواع التي ليست بنى.
المجموعات
- المصفوفاتللمصفوفة في Go طول ثابت هو جزء من نوعها، وتُنسخ عند الإسناد. تعلّم كيف تعرّف المصفوفات وتمرّ عليها وتقارنها وتمرّرها، ولماذا تستخدم معظم شيفرات Go الشرائح بدلًا منها.
- الشرائحالشرائح (slices) هي نوع القوائم اليومي في Go. تعلّم make وappend والنمو، وlen مقابل cap، وكيف يتشارك التقطيع المصفوفة الخلفية (والخطأ الذي يسبّبه ذلك)، وcopy، والحزمة slices، والشرائح ثنائية الأبعاد، والفرق بين nil والفارغة.
- الخرائطتخزّن الخرائط في Go أزواج مفتاح وقيمة مع بحث سريع. تعلّم كيف تنشئها، وتتحقّق من وجود مفتاح بصيغة comma-ok، وتحذف، وتمرّ عليها (بترتيب عشوائي)، وترتّب المفاتيح، وتخزّن البنى، وتتجنّب panic الخريطة nil والكتابة المتزامنة.
- المجموعاتلا تملك Go نوع مجموعة مدمجًا. الأسلوب المعتاد خريطة بقيم من البنية الفارغة. تعلّم الإضافة والفحص والحذف، والاتحاد والتقاطع والفرق، وكيف تكتب نوع Set عامًا صغيرًا.
- الترتيبرتّب الشرائح في Go بـ slices.Sort وslices.SortFunc، ورتّب البنى حسب حقل واحد أو عدة حقول بـ cmp.Compare، وأبقِ العناصر المتساوية بترتيبها بالترتيب المستقر، واقرأ شيفرة sort.Slice الأقدم.
البنى والواجهات والأنواع العامة
- البنىتجمع البنى (structs) حقولًا مسمّاة في نوع واحد. تعلّم كيف تعرّفها وتهيّئها، والقيم الصفرية، والمؤشرات إلى البنى، والبنى المجهولة، والمقارنة، ووسوم البنى، واصطلاح دالة البناء NewX.
- المؤشراتيحمل المؤشر عنوان قيمة. تعلّم & و* وnew والمؤشرات إلى البنى، ولماذا يمكنك بأمان إعادة مؤشر إلى متغيّر محلي، ومتى تستخدم المؤشرات، وحالة panic عند إلغاء مرجعية مؤشر nil.
- الواجهاتتتحقّق الواجهات في Go ضمنيًا: أي نوع له التوابع الصحيحة يطبّقها. تعلّم الواجهات الصغيرة مثل io.Reader وfmt.Stringer، والواجهة الفارغة any، وفخ الواجهة nil، وقاعدة اقبل الواجهات وأعد البنى.
- تضمين البنىيضع التضمين نوعًا داخل آخر دون اسم حقل، فتُرقّى حقوله وتوابعه إلى النوع الخارجي. تعلّم كيف تعمل الترقية، وتضمين الواجهات، وتعارض الأسماء، ولماذا ليس التضمين وراثة.
- تأكيدات النوعيستخرج تأكيد النوع القيمة المحدّدة من واجهة. تعلّم x.(T)، وصيغة comma-ok التي لا تسبّب panic أبدًا، والتأكيد إلى واجهة أخرى، وtype switch، وerrors.As للأخطاء المغلّفة.
- الأنواع العامةتتيح الأنواع العامة (Go 1.18 وما بعده) لدالة أو نوع واحد العمل مع أنواع كثيرة مع الحفاظ على أمان الأنواع. تعلّم معاملات النوع، والقيود any وcomparable وcmp.Ordered، والقيود المخصّصة بـ ~، والأنواع العامة، ومتى لا تستخدمها.
الأخطاء
- معالجة الأخطاءتعامل Go الأخطاء كقيم عادية تعيدها الدوال. تعلّم الواجهة error، وif err != nil، وerrors.New وfmt.Errorf، وإعادة الأخطاء مع سياق، وفحصها بـ errors.Is وerrors.As، ومعالجة كل خطأ مرة واحدة.
- الأخطاء المخصّصةعرّف أخطاء حارسة وأنواع أخطاء مخصّصة، وغلّف الأخطاء بـ %w، وافحصها بـ errors.Is وerrors.As، واجمع عدة أخطاء بـ errors.Join، واكتب التابعين Unwrap وIs عند الحاجة.
- panic وrecoverتوقف حالة panic التنفيذ العادي وتفكّ المكدّس مع تنفيذ الاستدعاءات المؤجّلة. تعلّم ما يسبّبها، وكيف يوقفها recover داخل دالة مؤجّلة، ورسائل أخطاء وقت التشغيل التي ستراها، ومتى تكون panic القرار الصحيح.
التزامن
- الـ Goroutinesكيف تشغّل الدوال بالتزامن بالكلمة go، وتنتظر انتهاءها، وتستعيد نتائجها، وتتجنّب سباقات البيانات والتسرّبات والانهيارات التي تسهّل الـ goroutines الوقوع فيها.
- القنواتكيف تنقل القنوات في Go القيم بين الـ goroutines: القنوات المخزّنة وغير المخزّنة، الإغلاق والمرور بـ range، أنواع الاتجاه، خطأ الجمود (deadlock)، وخط معالجة مبني منها.
- العبارة selectكيف تنتظر select عدة عمليات قنوات في آن واحد: الاختيار بين الحالات الجاهزة، والإرسال والاستقبال دون توقّف مع default، والمهل بـ time.After، وإيقاف الحلقات بقناة إيقاف أو سياق.
- WaitGroupكيف تنتظر sync.WaitGroup مجموعة من الـ goroutines حتى تنتهي: قواعد Add وDone وWait، ولماذا يجب تمريرها بمؤشر، وجمع النتائج والأخطاء، ومجموعة عمّال مبنية عليها.
- Mutexكيف تحمي الحالة المشتركة بين الـ goroutines بـ sync.Mutex وsync.RWMutex، ومتى تكفي sync/atomic، وكيف تنفّذ sync.Once الإعداد مرة واحدة بالضبط، وأخطاء القفل التي تسبّب الجمود.
- الحزمة contextكيف يحمل context.Context الإلغاء والمواعيد النهائية والقيم الخاصة بالطلب عبر برنامج Go: Background وWithCancel وWithTimeout وWithValue، وctx.Done داخل select، والسياق في خوادم HTTP وعملائه.
المكتبة القياسية
- الحزمة timeكيف تتعامل مع التواريخ والأوقات في Go: time.Now وtime.Sleep، وحساب المدد، وتخطيط المرجع 2006-01-02 15:04:05 لـ Format وParse، والمناطق الزمنية، والطوابع الزمنية Unix، والمؤقّتات وtickers.
- JSONكيف ترمّز JSON وتفكّ ترميزه في Go بـ encoding/json: Marshal وUnmarshal، وسوم البنى مثل omitempty وomitzero، الطباعة المنسّقة، فكّ الترميز إلى map[string]any، رفض الحقول المجهولة، والتدفّق بـ Decoder.
- قراءة الملفات وكتابتهاكيف تقرأ الملفات وتكتبها في Go: os.ReadFile وos.WriteFile، القراءة سطرًا بسطر بـ bufio.Scanner، الإلحاق بـ os.OpenFile، التحقّق من وجود ملف، والتعامل مع المجلدات.
- خادم HTTPكيف تبني خادم ويب بالحزمة القياسية net/http في Go: المعالجات، التوجيه بـ ServeMux مع الطرق ومتغيّرات المسار (Go 1.22)، ردود JSON، رموز الحالة، الطبقات الوسيطة، المهل والإيقاف اللطيف.
- عميل HTTPكيف ترسل طلبات HTTP في Go بـ net/http: http.Get، قراءة الجسم وإغلاقه، فحص رموز الحالة، مهل http.Client، الطلبات مع السياق والترويسات، معاملات الاستعلام، وإرسال JSON بـ POST.
- وسائط سطر الأوامركيف يقرأ برنامج Go سطر الأوامر: os.Args، الحزمة flag للخيارات ذات الأنواع، الأوامر الفرعية بـ FlagSet، متغيّرات البيئة بـ os.Getenv وos.LookupEnv، ورموز الخروج بـ os.Exit.
- التعابير النمطيةكيف تستخدم التعابير النمطية في Go بالحزمة regexp: MustCompile وMatchString وFindString وFindAllString، ومجموعات الالتقاط والمجموعات المسمّاة، وReplaceAllString، وحدود صياغة RE2 مثل غياب lookbehind.
- التسجيلكيف تسجّل في Go: الحزمة الكلاسيكية log بأعلامها وlog.Fatal، والحزمة log/slog (Go 1.21) للسجلات المهيكلة بالمستويات وسمات المفتاح والقيمة ومعالجات النص وJSON والمسجِّلات التي تحمل سياقًا عبر With.
الاختبار وبنية المشروع
- الاختباركيف تختبر شيفرة Go بالحزمة القياسية testing والأمر go test: ملفات _test.go، ودوال TestXxx، وt.Errorf مقابل t.Fatalf، واختبارات الجداول مع t.Run، والدوال المساعدة والمجلدات المؤقّتة، والتغطية، وقياس الأداء بـ b.Loop، واختبارات الأمثلة.
- هيكلة المشروعكيف تنظّم مشروع Go: ابدأ مسطّحًا، وقسّم إلى حزم عندما يوجد سبب، واستخدم cmd/ لعدة ملفات تنفيذية وinternal/ للشيفرة التي لا يجوز لغيرك استيرادها، وسمِّ الحزم جيدًا، وأبقِ الاختبارات بجوار الشيفرة.