الأساسيات

دالة نوع فاريادك Variadic Function

– ماهي دالة فاريادك Variadic Function ؟

هي دالة يمكن أن تقبل (أن تمرر بها) عدد غير محدد من الباراميترز بدون تعريفها بشكل صريح.

الصيغة

اذا كان الباراميتر الاخير من الدالة مكتوب بالشكل: …T , إذاً فالدالة يمكن أن تقبل عدد غير محدود من الباراميترات .
مثال

package main

import (
"fmt"
)

func add(nums ...int) int {
sum := 0
for _, v := range nums {
sum += v
}
return sum
}

func main() {
fmt.Println(add(1, 1, 1, 5, 9, 10))
}

في السطر السابع أنشئنا دالة add مهمتها أن تقوم بجمع الأعداد المدخلة كباراميترز, ولأننا استخدمنا صيغة دالة فاريادك (اسم الباراميتر ثم ثلاث نقط ثم نوع بياناته), عندها يمكننا أن ندخل عدد غير محدود من الأرقام كباراميترز.

والنتيجة ستكون

27

مثال آخر

package main

import (
"fmt"
)

func find(num int, nums ...int) {
fmt.Printf("type of nums is %T\n", nums)
found := false
for i, v := range nums {
if v == num {
fmt.Println(num, "found at index", i, "in", nums)
found = true
}
}
if !found {
fmt.Println(num, "not found in ", nums)
}
fmt.Printf("\n")
}
func main() {
find(89, 89, 90, 95)
find(45, 56, 67, 45, 90, 109)
find(78, 38, 56, 98)
find(87)
}

والنتيجة ستكون

type of nums is []int
89 found at index 0 in [89 90 95]

type of nums is []int
45 found at index 2 in [56 67 45 90 109]

type of nums is []int
78 not found in [38 56 98]

type of nums is []int
87 not found in []

– كيف تعمل دالة فاريادك ؟

تقوم بتحويل العدد المتغير من الباراميترز الممررة إلى شريحة جديدة ذات نوع بيانات باراميتر الفاريادك, على سبيل المثال, في السطر 22 من المثال السابق, الباراميترز 89,90,95 للدالة find, إذاً فالدالة ستقوم بتحويلهم لشريحة جديد معرفة بالشكل الاتي

nums := []int{89, 90, 95}

– تمرير شريحة لدالة فاريادك variadic
..

مثال

package main

import (
"fmt"
)

func find(num int, nums ...int) {
fmt.Printf("type of nums is %T\n", nums)
found := false
for i, v := range nums {
if v == num {
fmt.Println(num, "found at index", i, "in", nums)
found = true
}
}
if !found {
fmt.Println(num, "not found in ", nums)
}
fmt.Printf("\n")
}
func main() {
nums := []int{89, 90, 95}
find(89, nums)
}

في السطر 23, قمنا بتمرير شريحة slice لدالة تتوقع أن يتم تمرير عدد غير محدد من المتغيرات كباراميترز (دالة فاريادك variadic function)

وهذا لن يعمل وسيظهر رسالة خطأ شبيهة بالاتي

main.go:23: cannot use nums (type []int) as type int in argument to find

لماذا ظهر خطأ؟
الجواب واضح ومباشر اذا دققنا النظر في جملة تعريف الدالة

func find(num int, nums ...int)

حسب تعريف دالة فاريادك, فإن عبارة nums …int تعني أنها تقبل عدد غير محدد من المتغيرات من نوع int كـ باراميتر.

في السطر 23 من المثال السابق, nums تم تمريره كباراميتر فاريادك variadic parameter لدالة find, وكما ناقشنا سابقاً أن المتغيرات الممرة عبر باراميتر فاريادك سيتم تحويلها لشريحة slice من نوع بيانات int (في هذه الحالة)
ففي حالة هذا المثال, فإن المجمّع Compiler يحاول إنشاء شريحة من متغيرات ذات نوع بيانات int ولكن تم تمرير شريحة عوضاً عن متغير, وكما ذكرنا بدرس الشرائح, فإن شريحة الارقام يكون نوع بياناتها هو []int وليس int
وبإختصار فإن الدالة تنتظر نوع بيانات int ولكن حصلت على []int , وهذا بالتأكيد سينتج عنه خطأ .

ملاحظة: يمكنك تشغيل أكواد وأمثلة لغة غو من خلال GoLang Playground أو GoPlay.Space .

نبذة عن الكاتب

Firas M. Darwish

Software Engineer, PHP/Laravel, C#, GoLang, founder of ArGoLang.com & others ..

شاركنا رأيك :)