تعريف الـ Methods على الـ Structs
جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 6 من 68.
في لغة Go، الـ method هي دالة تنتمي إلى نوع (type) معين. وعلى عكس الدوال العادية التي تعمل بشكل مستقل، يتم إرفاق الـ methods بالـ structs وتسمح لك بتعريف سلوك لأنواع البيانات المخصصة (custom data types) الخاصة بك.
لتعريف تابع (method)، تضع مستقبلاً (receiver) بين الكلمة المفتاحية func واسم التابع. يحدد المستقبل النوع الذي ينتمي إليه التابع.
type Person struct {
Name string
Age int
}
func (p Person) greet() {
fmt.Printf("Hello, my name is %s\n", p.Name)
}في هذا المثال، (p Person) هو المستقبل (receiver)، مما يجعل greet دالة تابعة (method) للنوع Person. المتغير p يمثل نسخة (instance) من Person التي يتم استدعاء الدالة عليها، بشكل مشابه لـ this في اللغات الأخرى.
يمكنك بعد ذلك استدعاء الطريقة باستخدام تدوين النقطة (dot notation) على أي مثيل (instance) من Person، مما يمنح الهياكل (structs) الخاصة بك القدرة على تنفيذ إجراءات متعلقة ببياناتها.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
التحدي
سهلفي هذا التحدي، ستتدرب على تعريف الطرق (methods) على الهياكل (structs) من خلال إنشاء نظام بسيط لإدارة الكتب. ستقوم بإنشاء هيكل Book وتعريف طرق تسمح للكتاب بعرض معلوماته.
ملاحظة هامة: نظراً لأن عناوين الكتب وأسماء المؤلفين قد تحتوي على مسافات، ستحتاج إلى استخدام bufio.Scanner لقراءة أسطر الإدخال بالكامل. تتوقف دالة fmt.Scanln عن القراءة عند أول مسافة، مما قد يؤدي إلى تجزئة العناوين وأسماء المؤلفين المكونة من عدة كلمات. استخدم bufio.NewScanner(os.Stdin) واستدعِ scanner.Scan() متبوعة بـ scanner.Text() لقراءة أسطر كاملة.
ستتلقى ثلاثة مدخلات:
- سلسلة نصية تمثل عنوان الكتاب (مثلاً،
"The Go Programming Language") - سلسلة نصية تمثل اسم المؤلف (مثلاً،
"Alan Donovan") - سلسلة نصية تمثل عدد الصفحات (مثلاً،
"380")
مهمتك هي:
- تعريف هيكل
Bookبثلاثة حقول:Title(string)، وAuthor(string)، وPages(int) - إنشاء طريقة تسمى
displayInfoمع مستقبل قيمة (value receiver) تقوم بطباعة معلومات الكتاب بالتنسيق التالي:"Title: [title], Author: [author], Pages: [pages]" - إنشاء طريقة تسمى
getDescriptionمع مستقبل قيمة (value receiver) تعيد سلسلة نصية بالتنسيق التالي:"[title] by [author]" - استخدام
bufio.Scannerلقراءة أسطر الإدخال بشكل صحيح:- إنشاء ماسح ضوئي:
scanner := bufio.NewScanner(os.Stdin) - لكل سطر إدخال: استدعِ
scanner.Scan()ثمscanner.Text() - هذا يضمن قراءة العناوين وأسماء المؤلفين التي تحتوي على مسافات بشكل صحيح
- إنشاء ماسح ضوئي:
- تحليل المدخلات لإنشاء مثيل (instance) من
Book - استدعاء طريقة
displayInfoلطباعة معلومات الكتاب - استدعاء طريقة
getDescriptionوطباعة الوصف المعاد
يجب أن تستخدم الطرق متغير المستقبل (receiver variable) للوصول إلى حقول الهيكل وتنفيذ عملياتها الخاصة. تذكر أن الطرق ذات مستقبلي القيمة تعمل مع نسخة من مثيل الهيكل.
ورقة مرجعية
الأساليب (Methods) في لغة Go هي دوال تنتمي إلى نوع معين. يتم تعريفها باستخدام مستقبل (receiver) بين الكلمة المفتاحية func واسم الأسلوب:
type Person struct {
Name string
Age int
}
func (p Person) greet() {
fmt.Printf("Hello, my name is %s\n", p.Name)
}المستقبل (p Person) يجعل greet أسلوباً (method) للنوع Person. يمثل المتغير p المثيل (instance) الذي يتم استدعاء الأسلوب عليه.
يتم استدعاء الأساليب باستخدام تدوين النقطة (dot notation) على مثيلات الـ struct، مما يسمح للـ structs بتنفيذ إجراءات متعلقة ببياناتها.
جرّب بنفسك
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
// TODO: قم بتعريف هيكل Book هنا
// TODO: قم بتعريف دالة displayInfo هنا
// TODO: قم بتعريف دالة getDescription هنا
func main() {
// إنشاء ماسح ضوئي (scanner) لقراءة أسطر الإدخال
scanner := bufio.NewScanner(os.Stdin)
// قراءة العنوان
scanner.Scan()
title := scanner.Text()
// قراءة المؤلف
scanner.Scan()
author := scanner.Text()
// قراءة عدد الصفحات
scanner.Scan()
pagesStr := scanner.Text()
// تحويل نص الصفحات إلى عدد صحيح
pages, _ := strconv.Atoi(pagesStr)
// TODO: قم بإنشاء كائن من Book واستدعاء الدوال
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1تدفق التحكم المتقدم
جملة Switch مع `fallthrough`الخروج من الحلقات المتداخلةالاستمرار في حلقة محددةجملة `goto`ملخص - التحكم المتقدم في الحلقات2الـ Structs والميثودز (Methods)
تعريف الـ Methods على الـ Structsالـ Value Receiversالـ Pointer Receiversاختيار الـ Receiversالـ Methods مقابل الـ Functionsملخص - سلوك الـ Struct5تعمق في الـ Maps
Maps من نوع Structsالـ Pointers كقيم في الـ Mapsالتحقق من الـ Nil Mapsمقارنة الـ Mapsمراجعة - عداد تكرار الكلمات3الواجهات (الأساسيات)
ما هي الواجهة؟تعريف الواجهةتطبيق الواجهةاستخدام أنواع الواجهاتالواجهة الفارغةتأكيدات النوع (Type Assertions)تبديل النوع (Type Switch)ملخص - الأشكال والسلوكيات