מקבלי מצביע
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 8 מתוך 68.
בעוד שמקבלי ערך עובדים עם עותקים של מבנים, מקבלי מצביע עובדים ישירות עם מופע המבנה המקורי. כשמגדירים מתודה עם מקבל מצביע, המתודה יכולה לשנות את הנתונים המקוריים מכיוון שהיא מקבלת מצביע למבנה ולא עותק.
כדי ליצור מקבל מצביע, מוסיפים כוכבית * לפני שם הטיפוס בהצהרת המקבל:
type Person struct {
Name string
Age int
}
func (p *Person) haveBirthday() {
p.Age++ // זה משנה את ה-struct המקורי
}בדוגמה זו, (p *Person) הוא מקבל מצביע. כשקוראים למתודה haveBirthday על מופע של Person, המתודה מקבלת מצביע למבנה המקורי. כל שינוי בשדות המבנה דרך המצביע הזה ישנה לצמיתות את הנתונים המקוריים.
מקבלי מצביע חיוניים כשהמתודות שלך צריכות לעדכן את השדות של המבנה, ולכן הם מתאימים במיוחד לפעולות שמשנות את מצב הנתונים שלך.
אתגר
קלבאתגר הזה תתרגלו יצירת מתודות עם מקבלי מצביע באמצעות בניית מערכת פשוטה לניהול חשבון בנק. תיצרו מבנה Account ותגדירו מתודות שיכולות לשנות את יתרת החשבון באמצעות מקבלי מצביע.
תקבלו שלוש קלטים:
- מחרוזת המייצגת את שם בעל החשבון (לדוגמה,
"John Smith") - מחרוזת המייצגת את יתרת החשבון ההתחלתית (לדוגמה,
"1000.50") - מחרוזת המייצגת את סכום העסקה (לדוגמה,
"250.75")
המשימה שלכם היא:
- להגדיר מבנה
Accountעם שני שדות:Name(מחרוזת) ו-Balance(float64) - ליצור מתודה בשם
depositעם מקבל מצביע, שמוסיפה את הסכום הנתון ליתרת החשבון - ליצור מתודה בשם
withdrawעם מקבל מצביע, שמחסרת את הסכום הנתון מיתרת החשבון - ליצור מתודה בשם
displayBalanceעם מקבל ערך, שמדפיסה את פרטי החשבון בפורמט:"Account: [name], Balance: $[balance]" - לנתח את הקלטים כדי ליצור מופע של
Account - לקרוא ל-
displayBalanceכדי להציג את היתרה ההתחלתית - לקרוא ל-
depositעם סכום העסקה - לקרוא ל-
displayBalanceכדי להציג את היתרה לאחר ההפקדה - לקרוא ל-
withdrawעם סכום העסקה - לקרוא ל-
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: הציגו את היתרה ההתחלתית, בצעו הפקדה, הציגו את היתרה, בצעו משיכה והציגו את היתרה הסופית
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאיתרגלו בעצמכם: קומפיילר Go אונליין