Menu
Coddy logo textTech

מקבלי Pointer לעומת Value

חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 8 מתוך 107.

למתודות יכולה להיות מקבלת ערך או מקבלת מצביע. מקבלת ערך פועלת על עותק של המבנה. מקבלת מצביע פועלת על המבנה המקורי ויכולה לשנות את השדות שלו.

מקבל ערך: פועל על עותק

type Counter struct {
    Count int
}

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

// זה לא משנה את המקור
func (c Counter) IncrementWrong() {
    c.Count++ // משנה רק את העותק!
}

מקבל מצביע: משנה את המקור

// זה אכן משנה את המקור
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

אתגר

בינוני

הוסף מתודות למבנה Wallet באמצעות טיפוסי המקבל הנכונים:

  • GetBalance: מקבל ערך, מחזיר את היתרה הנוכחית
  • Deposit: מקבל מצביע, מוסיף את הסכום ליתרה
  • Withdraw: מקבל מצביע, מפחית את הסכום רק אם יש מספיק כסף

נסו בעצמכם

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 אונליין