الانتقال إلى المحتوى الرئيسي
الوحدة 3 · الدرس 2 من 512/50 في الدورة~12 min
دروس الوحدة (2/5)

عوائد متعددة وعوائد مسماة

في Go، يمكن للدالة إرجاع قيم متعددة. إنها الآلية التي يمكّن النمط (value, error) الذي رأيته بالفعل والذي ينتشر المكتبة القياسية بأكملها.

عوائد متعددة

تنتقل أنواع الإرجاع بين قوسين، مفصولة بفواصل:

Go
func divmod(a, b int) (int, int) {
    return a / b, a % b
}

q, r := divmod(17, 5) // q=3, r=2

لقد تم تدميرها بمهام متعددة. للتخلص من أحد تستخدم القيم _:

Go
_, r := divmod(17, 5) // solo il resto

النمط (T, error) المتعارف عليه

يتبعه كل stdlib تقريبًا. error هو الأخير دائمًا:

Go
func read(path string) ([]byte, error) {
    data, err := os.ReadFile(path)
    if err != nil {
        return nil, fmt.Errorf("read %q: %w", path, err)
    }
    return data, nil
}

العائدات المسماة

يمكنك تسمية القيم المرجعة: فهي تصبح متغيرات معلنة مسبقًا تمت تهيئتها إلى الصفر، وreturn بدون أي وسائط تُرجعها ("naked العودة"):

Go
func divmod(a, b int) (q, r int) {
    q = a / b
    r = a % b
    return       // naked: ritorna q, r
}

تظهر المرتجعات المسماة أيضًا في تلميحات أدوات التوثيق، لذا فهي مفيدة كشكل من أشكال التوثيق المضمّن للوظائف المعقدة — وليس فقط من أجل العودة العارية.

أكثر من عائدين؟

لا شيء يمنعك من (int, int, int, error)، إلا إذا شعرت بالحاجة إنها دائمًا علامة على أنه يجب عليك إرجاع struct:

Go
type Result struct {
    Sum  int
    Avg  float64
    Max  int
}

func analyze(nums []int) (Result, error) { ... }

جربه

تمرين#go.m3.l2.e1
المحاولات: 0جارٍ التحميل…

حدد divmod(a, b int) (int, int) الذي يُرجع القسمة والباقي.

جارٍ تحميل المحرر…
إظهار التلميح

أنواع الإرجاع بين قوسين: `(int, int)`.

الحل متاح بعد 3 من المحاولات

تمرين#go.m3.l2.e2
المحاولات: 0جارٍ التحميل…

قم بتنفيذ SafeDiv(a, b int) (int, error): if b == 0 return (0, error.New('divisione per Zero'))، وإلا (a/b, nil).

جارٍ تحميل المحرر…
إظهار التلميح

الخطأ دائمًا هو القيمة الأخيرة. عند الخطأ: القيمة صفر + خطأ.

الحل متاح بعد 3 من المحاولات

Quiz#go.m3.l2.e3
جاهز

ما الذي يطبعه هذا البرنامج باستخدام العوائد المسماة؟

Go
func f() (a, b int) {
    a = 1
    b = 2
    return
}
x, y := f()
fmt.Println(x, y)
خيارات الإجابة

خلاصة

  • قيم متعددة بين قوسين: func f() (T1, T2, error).
  • الاتفاقية: error دائمًا كقيمة أخيرة؛ عند الخطأ، القيمة صفر + الخطأ.
  • تقوم عمليات الإرجاع المسماة بالإعلان المسبق عن المتغيرات وتمكين عمليات الإرجاع المجردة.
  • إرجاعات عارية فقط في وظائف قصيرة جدًا؛ أبعد من ذلك، تعاني سهولة القراءة.
  • أكثر من 2-3 عوائد؟ ربما تريد الهيكل.