הגדרת שיטות במבנים
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 6 מתוך 68.
ב-Go, מתודה היא פונקציה ששייכת לסוג מסוים. בניגוד לפונקציות רגילות שעומדות בפני עצמן, מתודות משויכות למבנים ומאפשרות לך להגדיר התנהגות עבור סוגי הנתונים המותאמים אישית שלך.
כדי להגדיר מתודה, מציבים מקבל בין מילת המפתח 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 היא מתודה של הטיפוס Person. המשתנה p מייצג את המופע של Person שעליו נקראת המתודה, בדומה ל־this בשפות אחרות.
לאחר מכן אפשר לקרוא למתודה באמצעות תחביר נקודות בכל מופע של Person, וכך להעניק למבנים שלך את היכולת לבצע פעולות הקשורות לנתונים שלהם.
אתגר
קלבאתגר הזה תתרגלו הגדרת מתודות למבנים באמצעות יצירת מערכת פשוטה לניהול ספרים. תיצרו מבנה Book ותגדירו מתודות שיאפשרו לספר להציג את המידע שלו.
הערה חשובה: מכיוון שכותרות ספרים ושמות מחברים עשויים להכיל רווחים, תצטרכו להשתמש ב-bufio.Scanner כדי לקרוא שורות קלט שלמות. הפונקציה fmt.Scanln מפסיקה לקרוא ברווח הראשון, דבר שיפגע בכותרות ובשמות מחברים המורכבים מכמה מילים. השתמשו ב-bufio.NewScanner(os.Stdin) וקראו ל-scanner.Scan() ולאחר מכן ל-scanner.Text() כדי לקרוא שורות שלמות.
תקבלו שלושה קלטים:
- מחרוזת שמייצגת את כותרת הספר (לדוגמה,
"The Go Programming Language") - מחרוזת שמייצגת את שם המחבר (לדוגמה,
"Alan Donovan") - מחרוזת שמייצגת את מספר העמודים (לדוגמה,
"380")
עליכם:
- להגדיר מבנה
Bookעם שלושה שדות:Title(מחרוזת),Author(מחרוזת) ו-Pages(מספר שלם) - ליצור מתודה בשם
displayInfoעם מקבל לפי ערך, שמדפיסה את פרטי הספר בפורמט:"Title: [title], Author: [author], Pages: [pages]" - ליצור מתודה בשם
getDescriptionעם מקבל לפי ערך, שמחזירה מחרוזת בפורמט:"[title] by [author]" - להשתמש ב-
bufio.Scannerכדי לקרוא כראוי את שורות הקלט:- ליצור סורק:
scanner := bufio.NewScanner(os.Stdin) - עבור כל שורת קלט: לקרוא ל-
scanner.Scan()ואז ל-scanner.Text() - כך מובטח שכותרות ושמות מחברים הכוללים רווחים ייקראו כראוי
- ליצור סורק:
- לנתח את הקלטים כדי ליצור מופע של
Book - לקרוא למתודה
displayInfoכדי להדפיס את פרטי הספר - לקרוא למתודה
getDescriptionולהדפיס את התיאור שהוחזר
המתודות צריכות להשתמש במשתנה המקבל כדי לגשת לשדות המבנה ולבצע את הפעולות המתאימות. זכרו שמתודות עם מקבלים לפי ערך פועלות על עותק של מופע המבנה.
נסו בעצמכם
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
// TODO: הגדירו כאן את המבנה Book
// TODO: הגדירו כאן את המתודה displayInfo
// TODO: הגדירו כאן את המתודה getDescription
func main() {
// צרו סורק לקריאת שורות קלט
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 וקראו למתודות
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאיתרגלו בעצמכם: קומפיילר Go אונליין