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

الـ Pointer Receivers مقابل الـ Value Receivers

جزء من قسم البرمجة كائنية التوجه في رحلة GO على Coddy. الدرس 8 من 107.

يمكن أن تكون للطرائق إما value receiver أو pointer receiver. يعمل value receiver على نسخة copy من struct. ويعمل pointer receiver على struct original ويمكنه modify حقوله.

مستقبِل القيمة: يعمل على نسخة

type Counter struct {
    Count int
}

func (c Counter) GetCount() int {
    return c.Count
}

// هذا لا يعدّل الأصل
func (c Counter) IncrementWrong() {
    c.Count++ // يغيّر النسخة فقط!
}

مستقبِل المؤشر: يُعدّل original

// هذا يُعدِّل الأصل فعلاً
func (c *Counter) Increment() {
    c.Count++
}

func (c *Counter) Reset() {
    c.Count = 0
}

استخدام كليهما معًا

func main() {
    counter := Counter{Count: 0}

    counter.Increment()
    counter.Increment()
    fmt.Println(counter.GetCount()) // الناتج: 2

    counter.Reset()
    fmt.Println(counter.GetCount()) // الناتج: 0
}

استخدم مستقبِل قيمة عندما تكون الطريقة تقرأ البيانات فقط. استخدم مستقبِل مؤشر (*StructName) عندما تحتاج الطريقة إلى تعديل حقول البنية. تتولى Go تلقائيًا التعامل مع الإشارة. تستدعي كليهما بالطريقة نفسها.

challenge icon

التحدي

متوسط

أضف methods إلى بنية Wallet باستخدام أنواع receiver الصحيحة:

  • GetBalance: ‏value receiver، يعيد الرصيد الحالي
  • Deposit: ‏pointer receiver، يضيف amount إلى الرصيد
  • Withdraw: ‏pointer receiver، يطرح amount فقط إذا كانت الأموال كافية

جرّب بنفسك

package main

import "fmt"

func main() {
    var balance, deposit, withdraw float64
    fmt.Scan(&balance, &deposit, &withdraw)

    w := Wallet{Balance: balance}

    fmt.Printf("Balance: %.2f\n", w.GetBalance())

    w.Deposit(deposit)
    fmt.Printf("After deposit: %.2f\n", w.GetBalance())

    w.Withdraw(withdraw)
    fmt.Printf("After withdrawal: %.2f\n", w.GetBalance())

    fmt.Printf("Final balance: %.2f\n", w.GetBalance())
}
quiz iconاختبر نفسك

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Go عبر الإنترنت