الدوال (Functions) هي اللبنات الأساسية لتنظيم الكود وإعادة استخدامه. تتميز Go بدعم قوي ومرن للدوال يشمل ميزات فريدة مثل إرجاع عدة قيم في وقت واحد. في هذا الدرس سنغطي كل ما تحتاجه لإتقان كتابة الدوال في Go.
تعريف الدالة الأساسي
تعرّف الدالة باستخدام الكلمة المفتاحية func متبوعة باسم الدالة، ثم قائمة بالمعاملات بين قوسين، ثم نوع القيمة المُرجعة (إن وجدت)، ثم جسم الدالة بين أقواس معقوفة.
func sayHello() {
fmt.Println("مرحبًا!")
}
func main() {
sayHello()
}
المعاملات وإرجاع قيمة
يمكن للدالة أن تستقبل معاملات وأن تُرجع قيمة. يُكتب نوع كل معامل بعد اسمه، ونوع القيمة المُرجعة بعد قوس المعاملات.
func add(a int, b int) int {
return a + b
}
result := add(5, 3) // result = 8
اختصار أنواع المعاملات
إذا كان لمعاملين متتاليين أو أكثر نفس النوع، يمكنك كتابة النوع مرة واحدة في النهاية، مما يجعل الكود أكثر اختصارًا وأناقة.
func multiply(a, b, c int) int {
return a * b * c
}
إرجاع عدة قيم
من أبرز ميزات Go قدرة الدالة على إرجاع أكثر من قيمة في وقت واحد. هذه الميزة تستخدم بكثرة في معالجة الأخطاء، حيث تعيد الدالة القيمة الأساسية وكائن الخطأ معًا.
func divide(a, b float64) (float64, string) {
if b == 0 {
return 0, "لا يمكن القسمة على صفر"
}
return a / b, ""
}
result, err := divide(10, 2)
القيم المُرجعة المُسماة
تتيح Go تسمية القيم المُرجعة في توقيع الدالة، مما يجعل الكود أكثر توثيقًا. تكون هذه القيم متاحة كمتغيرات داخل الدالة، ويكفي استخدام return وحدها لإرجاعها.
func rectangle(w, h float64) (area, perimeter float64) {
area = w * h
perimeter = 2 * (w + h)
return
}
الدوال كقيم (Function as Value)
الدوال في Go من الدرجة الأولى (First-class)، أي يمكن إسنادها إلى متغيرات وتمريرها كمعاملات لدوال أخرى. هذا يفتح الباب لأساليب برمجة وظيفية قوية.
square := func(n int) int {
return n * n
}
fmt.Println(square(5)) // 25