الـ 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 دون تعديلها. فهي آمنة للاستخدام لأنها تضمن بقاء البيانات الأصلية دون تغيير، مما يجعل الكود الخاص بك أكثر قابلية للتنبؤ ويمنع الآثار الجانبية غير المقصودة.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
التحدي
سهلفي هذا التحدي، ستتدرب على العمل مع مستقبلات القيمة (value receivers) من خلال إنشاء نظام بسيط لمراقبة درجة الحرارة. ستقوم بإنشاء هيكل Sensor وتعريف دوال توضح كيفية عمل مستقبلات القيمة مع نسخ من الهيكل.
ستتلقى ثلاثة مدخلات:
- سلسلة نصية تمثل معرف المستشعر (على سبيل المثال،
"TEMP001") - سلسلة نصية تمثل قراءة درجة الحرارة الحالية (على سبيل المثال،
"23.5") - سلسلة نصية تمثل قيمة تعديل درجة الحرارة (على سبيل المثال،
"2.0")
مهمتك هي:
- تعريف هيكل
Sensorبحقلين:ID(string) وTemperature(float64) - إنشاء دالة تسمى
displayReadingمع مستقبل قيمة يقوم بطباعة معلومات المستشعر بالتنسيق التالي:"Sensor [ID]: [temperature]°C" - إنشاء دالة تسمى
adjustTemperatureمع مستقبل قيمة يضيف قيمة التعديل إلى درجة الحرارة ويطبع:"Adjusted reading: [new_temperature]°C" - تحليل المدخلات لإنشاء مثيل من
Sensor - استدعاء دالة
displayReadingلعرض درجة الحرارة الأصلية - استدعاء دالة
adjustTemperatureمع قيمة التعديل - استدعاء دالة
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 واستدعاء الطرق المطلوبة
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1تدفق التحكم المتقدم
جملة Switch مع `fallthrough`الخروج من الحلقات المتداخلةالاستمرار في حلقة محددةجملة `goto`ملخص - التحكم المتقدم في الحلقات2الـ Structs والميثودز (Methods)
تعريف الـ Methods على الـ Structsالـ Value Receiversالـ Pointer Receiversاختيار الـ Receiversالـ Methods مقابل الـ Functionsملخص - سلوك الـ Struct5تعمق في الـ Maps
Maps من نوع Structsالـ Pointers كقيم في الـ Mapsالتحقق من الـ Nil Mapsمقارنة الـ Mapsمراجعة - عداد تكرار الكلمات3الواجهات (الأساسيات)
ما هي الواجهة؟تعريف الواجهةتطبيق الواجهةاستخدام أنواع الواجهاتالواجهة الفارغةتأكيدات النوع (Type Assertions)تبديل النوع (Type Switch)ملخص - الأشكال والسلوكيات