Menu
Coddy logo textTech

מקבלי ערך

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

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

type Counter struct {
    Value int
}

func (c Counter) increment() {
    c.Value++  // זה משנה את העותק, לא את המקור
}

בדוגמה הזו, למתודה increment יש מקבל ערך (c Counter). כשקוראים למתודה הזו על מופע של Counter, Go יוצר עותק של המבנה ומעביר אותו למתודה. כל שינוי ב-c.Value בתוך המתודה משפיע רק על העותק הזה.

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

challenge icon

אתגר

קל

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

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

  • מחרוזת שמייצגת את מזהה החיישן (למשל, "TEMP001")
  • מחרוזת שמייצגת את קריאת הטמפרטורה הנוכחית (למשל, "23.5")
  • מחרוזת שמייצגת ערך התאמת טמפרטורה (למשל, "2.0")

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

  1. להגדיר מבנה Sensor עם שני שדות: ID (מחרוזת) ו-Temperature (float64)
  2. ליצור מתודה בשם displayReading עם מקבל ערך, שמדפיסה את פרטי החיישן בתבנית: "Sensor [ID]: [temperature]°C"
  3. ליצור מתודה בשם adjustTemperature עם מקבל ערך, שמוסיפה את ערך ההתאמה לטמפרטורה ומדפיסה: "Adjusted reading: [new_temperature]°C"
  4. לנתח את הקלטים כדי ליצור מופע של Sensor
  5. לקרוא למתודה displayReading כדי להציג את הטמפרטורה המקורית
  6. לקרוא למתודה adjustTemperature עם ערך ההתאמה
  7. לקרוא שוב למתודה 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 וקראו למתודות הנדרשות
    
}
quiz iconבחנו את עצמכם

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

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

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