دروس الوحدة (3/5)
وظائف فاراديك
** وظائف Variadic ** تقبل عددًا عشوائيًا من وسيطات الملف
نفس النوع. يمكنك التصريح عنها بوضع ... قبل نوع الأخير
المعلمة. داخل الدالة المعلمة هي شريحة.
تصريح
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فقط المعلمة الأخيرة يمكن أن تكون متغيرة:
func log(prefix string, values ...any) { ... } // ok
// func wrong(...int, suffix string) {} // ERROREنشر شريحة
إذا كان لديك شريحة بالفعل، فيمكنك تمريرها إلى دالة متغيرة باستخدام محمي_INLINE_3:
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* متغيرة:
// signature (semplificata):
// func Println(a ...any) (n int, err error)
fmt.Println("ciao", 42, true)
args := []any{"a", "b", "c"}
fmt.Println(args...)جربه
حدد sum(nums ...int) int الذي يُرجع مجموع كافة الوسائط.
إظهار التلميح
داخل الدالة `nums` يوجد نوع `[]int`.
الحل متاح بعد 3 من المحاولات
قم باستدعاء دالة المجموع الموجودة عن طريق تمرير أرقام الشرائح مع انتشار "أرقام...".
إظهار التلميح
يأتي `...` بعد اسم الشريحة.
الحل متاح بعد 3 من المحاولات
داخل `func f(args ...string)`، ما هو نوع `args`؟
func f(args ...string) {
_ = args
}خلاصة
...Tكمعلمة أخيرة = دالة متغيرة؛ بداخله محمي_INLINE_16.- يتم استدعاؤها بقيم مفردة: يقوم المترجم بتجميعها في شريحة.
- تم الاتصال بشريحة موجودة:
slice...(انتشار، إعادة استخدام الشريحة). - جميع وظائف
fmt.Print*متغيرة. - يمكن أن تكون المعلمة الأخيرة فقط متغيرة.