מקבלי ערך
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 7 מתוך 68.
כשמגדירים מתודה עם מקבל ערך, המתודה פועלת על עותק של מופע המבנה ולא על המקור. פירוש הדבר הוא שכל שינוי שנעשה במקבל בתוך המתודה לא ישפיע על משתנה המבנה המקורי.
type Counter struct {
Value int
}
func (c Counter) increment() {
c.Value++ // זה משנה את העותק, לא את המקור
}בדוגמה הזו, למתודה increment יש מקבל ערך (c Counter). כשקוראים למתודה הזו על מופע של Counter, Go יוצר עותק של המבנה ומעביר אותו למתודה. כל שינוי ב-c.Value בתוך המתודה משפיע רק על העותק הזה.
מקבלי ערך שימושיים כשהמתודה שלך צריכה רק לקרוא נתונים מהמבנה בלי לשנות אותו. בטוח להשתמש בהם, כי הם מבטיחים שהנתונים המקוריים יישארו ללא שינוי, וכך הקוד שלך צפוי יותר ונמנעות תופעות לוואי לא מכוונות.
אתגר
קלבאתגר הזה תתרגלו עבודה עם מקבלי ערך באמצעות יצירת מערכת פשוטה לניטור טמפרטורה. תיצרו מבנה Sensor ותגדירו מתודות שמדגימות איך מקבלי ערך פועלים עם עותקים של המבנה.
תקבלו שלוש קלטים:
- מחרוזת שמייצגת את מזהה החיישן (למשל,
"TEMP001") - מחרוזת שמייצגת את קריאת הטמפרטורה הנוכחית (למשל,
"23.5") - מחרוזת שמייצגת ערך התאמת טמפרטורה (למשל,
"2.0")
המשימה שלכם היא:
- להגדיר מבנה
Sensorעם שני שדות:ID(מחרוזת) ו-Temperature(float64) - ליצור מתודה בשם
displayReadingעם מקבל ערך, שמדפיסה את פרטי החיישן בתבנית:"Sensor [ID]: [temperature]°C" - ליצור מתודה בשם
adjustTemperatureעם מקבל ערך, שמוסיפה את ערך ההתאמה לטמפרטורה ומדפיסה:"Adjusted reading: [new_temperature]°C" - לנתח את הקלטים כדי ליצור מופע של
Sensor - לקרוא למתודה
displayReadingכדי להציג את הטמפרטורה המקורית - לקרוא למתודה
adjustTemperatureעם ערך ההתאמה - לקרוא שוב למתודה
displayReadingכדי להדגים שהמבנה המקורי נותר ללא שינוי
האתגר הזה ידגים שמתודות עם מקבלי ערך פועלות על עותקים של המבנה, ולכן ערך הטמפרטורה במבנה המקורי יישאר ללא שינוי גם לאחר הקריאה למתודה adjustTemperature. יש להציג את ערכי הטמפרטורה בדיוק של מקום אחד אחרי הנקודה העשרונית.
נסו בעצמכם
package main
import (
"fmt"
"strconv"
)
// TODO: הגדירו כאן את המבנה Sensor שלכם
// TODO: הגדירו כאן את המתודה displayReading שלכם עם מקבל ערך
// TODO: הגדירו כאן את המתודה adjustTemperature שלכם עם מקבל ערך
func main() {
// קראו את הקלטים
var sensorID string
var tempStr string
var adjustStr string
fmt.Scanln(&sensorID)
fmt.Scanln(&tempStr)
fmt.Scanln(&adjustStr)
// נתחו את ערכי הטמפרטורה וההתאמה
temperature, _ := strconv.ParseFloat(tempStr, 64)
adjustment, _ := strconv.ParseFloat(adjustStr, 64)
// TODO: צרו מופע של Sensor וקראו למתודות הנדרשות
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאיתרגלו בעצמכם: קומפיילר Go אונליין