Menu
Coddy logo textTech

מקבלי מצביע

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 8 מתוך 68.

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

כדי ליצור מקבל מצביע, מוסיפים כוכבית * לפני שם הטיפוס בהצהרת המקבל:

type Person struct {
    Name string
    Age  int
}

func (p *Person) haveBirthday() {
    p.Age++  // זה משנה את ה-struct המקורי
}

בדוגמה זו, (p *Person) הוא מקבל מצביע. כשקוראים למתודה haveBirthday על מופע של Person, המתודה מקבלת מצביע למבנה המקורי. כל שינוי בשדות המבנה דרך המצביע הזה ישנה לצמיתות את הנתונים המקוריים.

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

challenge icon

אתגר

קל

באתגר הזה תתרגלו יצירת מתודות עם מקבלי מצביע באמצעות בניית מערכת פשוטה לניהול חשבון בנק. תיצרו מבנה Account ותגדירו מתודות שיכולות לשנות את יתרת החשבון באמצעות מקבלי מצביע.

תקבלו שלוש קלטים:

  • מחרוזת המייצגת את שם בעל החשבון (לדוגמה, "John Smith")
  • מחרוזת המייצגת את יתרת החשבון ההתחלתית (לדוגמה, "1000.50")
  • מחרוזת המייצגת את סכום העסקה (לדוגמה, "250.75")

המשימה שלכם היא:

  1. להגדיר מבנה Account עם שני שדות: Name (מחרוזת) ו-Balance (float64)
  2. ליצור מתודה בשם deposit עם מקבל מצביע, שמוסיפה את הסכום הנתון ליתרת החשבון
  3. ליצור מתודה בשם withdraw עם מקבל מצביע, שמחסרת את הסכום הנתון מיתרת החשבון
  4. ליצור מתודה בשם displayBalance עם מקבל ערך, שמדפיסה את פרטי החשבון בפורמט: "Account: [name], Balance: $[balance]"
  5. לנתח את הקלטים כדי ליצור מופע של Account
  6. לקרוא ל-displayBalance כדי להציג את היתרה ההתחלתית
  7. לקרוא ל-deposit עם סכום העסקה
  8. לקרוא ל-displayBalance כדי להציג את היתרה לאחר ההפקדה
  9. לקרוא ל-withdraw עם סכום העסקה
  10. לקרוא ל-displayBalance כדי להציג את היתרה הסופית

יש להציג את היתרה בדיוק של שתי ספרות אחרי הנקודה העשרונית. האתגר הזה מדגים כיצד מקבלי מצביע מאפשרים למתודות לשנות את נתוני המבנה המקורי, בניגוד למקבלי ערך שעובדים עם עותקים.

נסו בעצמכם

package main

import (
	"fmt"
	"strconv"
)

// TODO: הגדירו כאן את המבנה Account

// TODO: הגדירו כאן את המתודה deposit עם מקבל מסוג מצביע

// TODO: הגדירו כאן את המתודה withdraw עם מקבל מסוג מצביע

// TODO: הגדירו כאן את המתודה displayBalance עם מקבל מסוג ערך

func main() {
	// קראו את הקלט
	var name string
	var initialBalanceStr string
	var transactionAmountStr string
	
	fmt.Scanln(&name)
	fmt.Scanln(&initialBalanceStr)
	fmt.Scanln(&transactionAmountStr)
	
	// המירו את מחרוזות הקלט לטיפוסים המתאימים
	initialBalance, _ := strconv.ParseFloat(initialBalanceStr, 64)
	transactionAmount, _ := strconv.ParseFloat(transactionAmountStr, 64)
	
	// TODO: צרו מופע של Account
	
	// TODO: הציגו את היתרה ההתחלתית, בצעו הפקדה, הציגו את היתרה, בצעו משיכה והציגו את היתרה הסופית
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת התוכנית

תרגלו בעצמכם: קומפיילר Go אונליין