Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الـ Value Receivers

جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 7 من 68.

عندما تقوم بتعريف method باستخدام value receiver، فإن الـ method يعمل على نسخة من مثيل الـ struct بدلاً من النسخة الأصلية. وهذا يعني أن أي تغييرات يتم إجراؤها على الـ receiver داخل الـ method لن تؤثر على متغير الـ struct الأصلي.

type Counter struct {
    Value int
}

func (c Counter) increment() {
    c.Value++  // هذا يعدل النسخة، وليس الأصل
}

في هذا المثال، تمتلك الطريقة increment مستقبل قيمة (value receiver) (c Counter). عندما تستدعي هذه الطريقة على مثيل (instance) من Counter، تقوم Go بإنشاء نسخة من الهيكل (struct) وتمريرها إلى الطريقة. أي تعديلات على c.Value داخل الطريقة تؤثر فقط على هذه النسخة.

تعتبر مستقبلات القيمة (Value receivers) مفيدة عندما تحتاج الـ method الخاصة بك فقط إلى قراءة البيانات من الـ struct دون تعديلها. فهي آمنة للاستخدام لأنها تضمن بقاء البيانات الأصلية دون تغيير، مما يجعل الكود الخاص بك أكثر قابلية للتنبؤ ويمنع الآثار الجانبية غير المقصودة.

quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

challenge icon

التحدي

سهل

في هذا التحدي، ستتدرب على العمل مع مستقبلات القيمة (value receivers) من خلال إنشاء نظام بسيط لمراقبة درجة الحرارة. ستقوم بإنشاء هيكل Sensor وتعريف دوال توضح كيفية عمل مستقبلات القيمة مع نسخ من الهيكل.

ستتلقى ثلاثة مدخلات:

  • سلسلة نصية تمثل معرف المستشعر (على سبيل المثال، "TEMP001")
  • سلسلة نصية تمثل قراءة درجة الحرارة الحالية (على سبيل المثال، "23.5")
  • سلسلة نصية تمثل قيمة تعديل درجة الحرارة (على سبيل المثال، "2.0")

مهمتك هي:

  1. تعريف هيكل Sensor بحقلين: ID (string) و Temperature (float64)
  2. إنشاء دالة تسمى displayReading مع مستقبل قيمة يقوم بطباعة معلومات المستشعر بالتنسيق التالي: "Sensor [ID]: [temperature]°C"
  3. إنشاء دالة تسمى adjustTemperature مع مستقبل قيمة يضيف قيمة التعديل إلى درجة الحرارة ويطبع: "Adjusted reading: [new_temperature]°C"
  4. تحليل المدخلات لإنشاء مثيل من Sensor
  5. استدعاء دالة displayReading لعرض درجة الحرارة الأصلية
  6. استدعاء دالة adjustTemperature مع قيمة التعديل
  7. استدعاء دالة displayReading مرة أخرى لتوضيح أن الهيكل الأصلي يظل دون تغيير

سيوضح هذا التحدي أن الدوال ذات مستقبلات القيمة تعمل على نسخ من الهيكل، لذا ستظل قيمة درجة حرارة الهيكل الأصلي دون تغيير حتى بعد استدعاء دالة adjustTemperature. يجب عرض قيم درجة الحرارة بدقة منزلة عشرية واحدة.

ورقة مرجعية

تعمل مستقبلات القيمة (Value receivers) على نسخة من مثيل الـ struct، وليس على الأصل. التغييرات التي يتم إجراؤها داخل الطريقة (method) لا تؤثر على الـ struct الأصلي.

type Counter struct {
    Value int
}

func (c Counter) increment() {
    c.Value++  // هذا يعدل النسخة، وليس الأصل
}

تكون مستقبلات القيمة مفيدة عندما تحتاج الطرق (methods) فقط إلى قراءة البيانات دون تعديل الـ struct الأصلي، مما يجعل الكود أكثر قابلية للتنبؤ ويمنع الآثار الجانبية غير المقصودة.

جرّب بنفسك

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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow