محتويات الدورة

Go / الأساسي: القيم وعقود البرامج / الدرس 3

الدوال وتدفق التحكم

حول الحسابات إلى عقود صغيرة وبرر الفروع والحلقات والتنظيف المؤجل بقواعد صريحة.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • شرح المعاملات بالقيمة والنتائج المتعددة.
  • تتبع الشروط والحلقات والنطاق وdefer.
  • تمييز دلالات متغيرات الحلقة في Go 1.22.

الدالة تعرض مدخلات ووعودا

يحدد تصريح الدالة أنواع المعاملات والنتائج. تمرر الوسائط بالقيمة: معامل int نسخة، لكن نسخ شريحة أو مؤشر قد يتيح الوصول لتخزين مشترك. صف المدخل المسموح والتعديل ومعنى النتيجة والفشل. تجعل النتائج المتعددة عقد قيمة وخطأ صريحا دون علامة سحرية.

فضل اسما واضحا ومسؤولية مترابطة صغيرة. لا ينبغي لمساعد حساب حصة قراءة الطرفية سرا أو إنهاء العملية. يتيح فصل الحساب من العرض للاختبارات تقديم قيم معروفة وفحص الأخطاء دون التحكم في جلسة تفاعلية كاملة.

رفض المدخلات غير الصالحة قبل الحساب

يقبل المثال الأول مجموعا غير سالب وقاسما موجبا تماما. يعيد خطأ وصفيا قبل القسمة إذا خالف المدخل المجال. يفي الاستدعاء الثابت بالعقد ويعرض نتيجة ناجحة عادية. في واجهة أكبر قرر هل يحتاج المستدعي فئة خطأ ثابتة بدلا من تحليل الرسالة.

شرط if منطقي في Go؛ وليست الأعداد قيما منطقية ضمنية. يقتصر نطاق التصريح القصير في مهيئ if على التعليمة وفروعها. راجع النطاق عند تشابه الاسم مع متغير خارجي، فقد يحجبه متغير محلي جديد.

go دالة مفحوصة متعددة النتائج
package main

import (
	"errors"
	"fmt"
)

func share(total, people int) (int, error) {
	if total < 0 || people <= 0 {
		return 0, errors.New("invalid share inputs")
	}
	return total / people, nil
}

func main() {
	value, err := share(12, 3)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("share", value)
}
الناتج المتوقع
share 4

تسمح المدخلات المفحوصة بالقسمة الصحيحة وتنتج أربعة مع خطأ nil.

شرح الثابت وشرط الانتهاء

تستخدم Go for للحلقات المعدودة والشرطية والمفتوحة. حدد قبل كل دورة في الجمع القيم التي ساهمت في المجمع. افحص الفراغ والحد الأعلى الدقيق. تخرج break من الحلقة أو switch المناسبة، وتنتقل continue للدورة التالية. لا تنتقل switch التعبيرية تلقائيا إلى الفرع التالي.

يجمع المثال الثاني الواحد حتى الخمسة. قبل الدورة i يساوي total مجموع الأعداد الموجبة السابقة. تحفظ إضافة i الثابت، وتجعل زيادة i الشرط i <= 5 كاذبا في النهاية. تلائم القيم الثابتة int؛ ويتطلب حد خارجي كبير برهانا جديدا للحساب والموارد.

go تجميع محدود بثابت بسيط
package main

import "fmt"

func main() {
	total := 0
	for i := 1; i <= 5; i++ {
		total += i
	}
	fmt.Println("total", total)
}
الناتج المتوقع
total 15

تضيف التحديثات واحدا واثنين وثلاثة وأربعة وخمسة فتنتج خمسة عشر.

معرفة المتغير المعاد استخدامه

في دلالات Go 1.22 تملك متغيرات التكرار المصرح بها في الحلقة نسخة جديدة لكل دورة. يهم ذلك للإغلاقات والعناوين المحفوظة. ولا يجدد المتغير المصرح به خارج الحلقة: يبقى range باستخدام = إسنادا لمتغيرات موجودة. اختلف سلوك التصريح داخل الحلقة في إصدارات اللغة الأقدم.

تسمح Go 1.22 أيضا بـrange على عدد صحيح فتنتج من صفر إلى الحد ناقص واحد إذا كان موجبا. وتضيف Go 1.23 الاجتياز على دوال التكرار. هذه ميزات مرتبطة بالإصدار؛ وتستخدم الدورة حلقات معدودة عادية حين تتجنب اعتمادا غير ضروري.

العمل المؤجل يتبع الدالة المحيطة

تجدول defer استدعاء عند عودة الدالة المحيطة. تُقيّم وسائطه عند تنفيذ defer، وتنفذ الاستدعاءات بترتيب الأخير أولا. وقد تقرأ دالة مغلقة مؤجلة القيمة اللاحقة لمتغير، فاختر عمدا بين التقاط وسيط حالي وقراءة حالة متغيرة.

لا تنفذ defer داخل حلقة طويلة عند نهاية كل دورة؛ وقد تتراكم الموارد حتى عودة الدالة. انقل عمل مورد كل دورة إلى مساعد أو أغلق صراحة عند الحاجة. تبسط defer الملكية لكنها لا تستبدل فحص النتائج وتصميم عمر محدود.

الأخطاء الشائعة وإصلاحها

تبقى نتيجة محلية دون تغيير على نحو مفاجئ.

لماذا يحدث؟
قدم تصريح قصير متغيرا يحجب الأصلي.
كيف تصلحه؟
أسند للمتغير المقصود أو اختر اسما مختلفا.
كيف تتجنب تكراره؟
راجع نطاق مهيئات if والكتل الداخلية.

تبقى موارد كثيرة مفتوحة أثناء الحلقة.

لماذا يحدث؟
ينتظر التنظيف المؤجل عودة الدالة كاملة.
كيف تصلحه؟
استخدم مساعد دورة أو تنظيفا صريحا لكل دورة.
كيف تتجنب تكراره؟
ارسم عمر المورد ولا تفترض defer عند نهاية الكتلة.

ما زال إغلاق يشارك قيمة تكرار.

لماذا يحدث؟
تسند الشيفرة لمتغير خارجي أو تستخدم دلالات أقدم.
كيف تصلحه؟
صرح بقيم كل دورة وافحص إصدار لغة الوحدة.
كيف تتجنب تكراره؟
ميز := من = وسجل توجيه go.

اختبر فهمك

1. عدل الجمع ليشمل الواحد حتى الستة وبرر النتيجة والانتهاء.

اعرض الحل المشروح

استخدم i <= 6. يبقى الثابت أن total يحتوي مجموع الأعداد الموجبة السابقة. تضيف الخطوة الأخيرة ستة لخمسة عشر فتنتج واحدا وعشرين. يصبح i سبعة فيفشل الشرط وينتهي التنفيذ. لا تعمم السلامة لحدود عشوائية دون فحص المجاميع الوسيطة وزمن التنفيذ.

2. صف share(12, 0) ولماذا لا تعامل العدد المعاد كإجابة صالحة.

اعرض الحل المشروح

يعيد الحارس صفرا وخطأ غير nil قبل القسمة. يجب أن يفحص المستدعي الخطأ ويرفض النتيجة العددية عند الفشل؛ فالصفر نتيجة بديلة لا حصة مقبولة. ينبغي اختبار الخطأ وغياب تعديل الحالة الخارجية. يقرر التطبيق طلب مدخل جديد أو تمرير الخطأ.

أهم ما تعلمته

  • تشمل عقود الدوال التعديل ومعنى الفشل.
  • تحتاج الحلقة ثابتا وحدا وتقدما نحو الانتهاء.
  • يتبع سلوك متغير الحلقة وتوقيت defer قواعد نطاق وإصدار صريحة.

المراجع الرسمية