ملخص - سلوك الـ Struct
جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 11 من 68.
التحدي
سهلفي هذا التحدي، ستتدرب على تنفيذ كل من مستقبلي القيمة (value receivers) ومستقبلي المؤشر (pointer receivers) من خلال إنشاء نظام بسيط لإدارة المستطيلات. ستقوم بإنشاء هيكل Rectangle وتعريف نوعين مختلفين من الطرق (methods) التي توضح متى يجب استخدام كل نوع من أنواع المستقبلات.
ستتلقى ثلاثة مدخلات:
- سلسلة نصية تمثل عرض المستطيل (مثلاً،
"5.0") - سلسلة نصية تمثل ارتفاع المستطيل (مثلاً،
"3.0") - سلسلة نصية تمثل عامل القياس (مثلاً،
"2.0")
مهمتك هي:
- تعريف هيكل
Rectangleبحقلين:Width(float64) وHeight(float64) - إنشاء طريقة تسمى
areaمع مستقبل قيمة (value receiver) تقوم بحساب وإرجاع مساحة المستطيل (العرض × الارتفاع) - إنشاء طريقة تسمى
scaleمع مستقبل مؤشر (pointer receiver) تقوم بضرب كل من العرض والارتفاع في عامل القياس المعطى - تحليل المدخلات لإنشاء مثيل من
Rectangle - طباعة المساحة الأولية باستخدام التنسيق:
"Initial area: [area]" - استدعاء طريقة
scaleمع عامل القياس - طباعة المساحة بعد القياس باستخدام التنسيق:
"Scaled area: [area]"
يجب عرض قيم المساحة كأرقام صحيحة عندما تكون كذلك (مثلاً، 15 بدلاً من 15.0)، ولكن مع منازل عشرية عند الضرورة (مثلاً، 15.5). يوضح هذا التحدي المبدأ الأساسي: استخدم مستقبلي القيمة للطرق التي تقرأ البيانات فقط (مثل حساب المساحة) ومستقبلي المؤشر للطرق التي تعدل الهيكل الأصلي (مثل تغيير أبعاد القياس).
جرّب بنفسك
package main
import (
"fmt"
"strconv"
)
// TODO: قم بتعريف هيكل Rectangle هنا
// TODO: قم بتنفيذ دالة المساحة (area method) مع مستقبل القيمة (value receiver) هنا
// TODO: قم بتنفيذ دالة القياس (scale method) مع مستقبل المؤشر (pointer receiver) هنا
func main() {
// قراءة المدخلات
var widthStr string
var heightStr string
var scaleStr string
fmt.Scanln(&widthStr)
fmt.Scanln(&heightStr)
fmt.Scanln(&scaleStr)
// تحويل المدخلات إلى float64
width, _ := strconv.ParseFloat(widthStr, 64)
height, _ := strconv.ParseFloat(heightStr, 64)
scaleFactor, _ := strconv.ParseFloat(scaleStr, 64)
// TODO: قم بإنشاء كائن Rectangle وقم بتنفيذ الحل أدناه
// طباعة المساحة الأولية
// fmt.Printf("Initial area: %.0f\n", initialArea) // استخدم هذا التنسيق للمخرجات
// تغيير حجم المستطيل
// طباعة المساحة بعد تغيير الحجم
// fmt.Printf("Scaled area: %.0f\n", scaledArea) // استخدم هذا التنسيق للمخرجات
}جميع دروس 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)ملخص - الأشكال والسلوكيات