Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

تعريف الـ 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) الخاصة بك القدرة على تنفيذ إجراءات متعلقة ببياناتها.

quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

challenge icon

التحدي

سهل

في هذا التحدي، ستتدرب على تعريف الطرق (methods) على الهياكل (structs) من خلال إنشاء نظام بسيط لإدارة الكتب. ستقوم بإنشاء هيكل Book وتعريف طرق تسمح للكتاب بعرض معلوماته.

ملاحظة هامة: نظراً لأن عناوين الكتب وأسماء المؤلفين قد تحتوي على مسافات، ستحتاج إلى استخدام bufio.Scanner لقراءة أسطر الإدخال بالكامل. تتوقف دالة fmt.Scanln عن القراءة عند أول مسافة، مما قد يؤدي إلى تجزئة العناوين وأسماء المؤلفين المكونة من عدة كلمات. استخدم bufio.NewScanner(os.Stdin) واستدعِ scanner.Scan() متبوعة بـ scanner.Text() لقراءة أسطر كاملة.

ستتلقى ثلاثة مدخلات:

  • سلسلة نصية تمثل عنوان الكتاب (مثلاً، "The Go Programming Language")
  • سلسلة نصية تمثل اسم المؤلف (مثلاً، "Alan Donovan")
  • سلسلة نصية تمثل عدد الصفحات (مثلاً، "380")

مهمتك هي:

  1. تعريف هيكل Book بثلاثة حقول: Title (string)، و Author (string)، و Pages (int)
  2. إنشاء طريقة تسمى displayInfo مع مستقبل قيمة (value receiver) تقوم بطباعة معلومات الكتاب بالتنسيق التالي: "Title: [title], Author: [author], Pages: [pages]"
  3. إنشاء طريقة تسمى getDescription مع مستقبل قيمة (value receiver) تعيد سلسلة نصية بالتنسيق التالي: "[title] by [author]"
  4. استخدام bufio.Scanner لقراءة أسطر الإدخال بشكل صحيح:
    • إنشاء ماسح ضوئي: scanner := bufio.NewScanner(os.Stdin)
    • لكل سطر إدخال: استدعِ scanner.Scan() ثم scanner.Text()
    • هذا يضمن قراءة العناوين وأسماء المؤلفين التي تحتوي على مسافات بشكل صحيح
  5. تحليل المدخلات لإنشاء مثيل (instance) من Book
  6. استدعاء طريقة displayInfo لطباعة معلومات الكتاب
  7. استدعاء طريقة 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 واستدعاء الدوال
    
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow