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

وظائف فاراديك

** وظائف Variadic ** تقبل عددًا عشوائيًا من وسيطات الملف نفس النوع. يمكنك التصريح عنها بوضع ... قبل نوع الأخير المعلمة. داخل الدالة المعلمة هي شريحة.

تصريح

Go
func sum(nums ...int) int {
    tot := 0
    for _, n := range nums {
        tot += n
    }
    return tot
}

sum()              // 0   (nums = []int{})
sum(1)             // 1
sum(1, 2, 3, 4)    // 10

فقط المعلمة الأخيرة يمكن أن تكون متغيرة:

Go
func log(prefix string, values ...any) { ... }   // ok
// func wrong(...int, suffix string) {}            // ERRORE

نشر شريحة

إذا كان لديك شريحة بالفعل، فيمكنك تمريرها إلى دالة متغيرة باستخدام محمي_INLINE_3:

Go
nums := []int{1, 2, 3}
sum(nums...)         // 6 — espande lo slice nei singoli argomenti

"..." يذهب ** بعد ** الشريحة. بدون انتشار ستحصل على نوع خطأ: سيتم تمرير []int حيث تتوقع الوظيفة تسلسلاً من int.

nums عبارة عن شريحة وليست حاوية جديدة

داخل الدالة nums يوجد نوع []int. كل شريحة القياسية عمليات العمل: len(nums)، nums[0]، range، إلخ.

حالة الاستخدام الكلاسيكية: fmt.Println

جميع وظائف fmt Print* متغيرة:

Go
// signature (semplificata):
// func Println(a ...any) (n int, err error)

fmt.Println("ciao", 42, true)
args := []any{"a", "b", "c"}
fmt.Println(args...)

جربه

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

حدد sum(nums ...int) int الذي يُرجع مجموع كافة الوسائط.

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

داخل الدالة `nums` يوجد نوع `[]int`.

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

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

قم باستدعاء دالة المجموع الموجودة عن طريق تمرير أرقام الشرائح مع انتشار "أرقام...".

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

يأتي `...` بعد اسم الشريحة.

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

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

داخل `func f(args ...string)`، ما هو نوع `args`؟

Go
func f(args ...string) {
    _ = args
}
خيارات الإجابة

خلاصة

  • ...T كمعلمة أخيرة = دالة متغيرة؛ بداخله محمي_INLINE_16.
  • يتم استدعاؤها بقيم مفردة: يقوم المترجم بتجميعها في شريحة.
  • تم الاتصال بشريحة موجودة: slice... (انتشار، إعادة استخدام الشريحة).
  • جميع وظائف fmt.Print* متغيرة.
  • يمكن أن تكون المعلمة الأخيرة فقط متغيرة.