إكمال مهمة
جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 23 من 68.
التحدي
سهلفي هذا الجزء من نظام إدارة المهام الخاص بك، ستقوم بتنفيذ القدرة على تحديد المهام كمكتملة. يركز هذا التحدي على استخدام مستقبلات المؤشرات (pointer receivers) لتعديل بيانات المهام الأصلية، مما يوضح كيف تسمح لك المؤشرات بتحديث حقول الهياكل (struct fields) بشكل دائم.
ملاحظة هامة: نظراً لأن أسماء المهام قد تحتوي على مسافات (مثل "Buy groceries")، ستحتاج إلى استخدام bufio.Scanner لقراءة أسطر كاملة من المدخلات. تتوقف وظيفة fmt.Scanf عن القراءة عند أول مسافة، مما قد يؤدي إلى تجزئة أسماء المهام التي تحتوي على مسافات. استخدم bufio.NewScanner(os.Stdin) واستدعِ scanner.Scan() متبوعة بـ scanner.Text() لقراءة أسطر كاملة.
ستتلقى ثلاثة مدخلات:
- سلسلة نصية تمثل عدد المهام (مثلاً،
"4") - سلسلة نصية تحتوي على بيانات المهام بالتنسيق التالي:
"name1:status1,name2:status2,name3:status3"حيث تكون الحالة إما"true"أو"false"(مثلاً،"Buy groceries:false,Call dentist:true,Finish project:false,Review code:false") - سلسلة نصية تمثل فهرس (index) المهمة المراد إكمالها (مثلاً،
"2"للمهمة الثالثة، باستخدام الفهرسة التي تبدأ من 0)
مهمتك هي:
- تعريف نفس هيكل
Taskمن التحديات السابقة مع حقولName(string) وCompleted(bool) - إنشاء وظيفة تسمى
completeTaskتأخذ مؤشراً إلى شريحة (slice) من هياكلTaskوفهرساً (int) كمعاملات - داخل وظيفة
completeTask، قم بتعديل حقلCompletedللمهمة عند الفهرس المعطى إلىtrue - استخدم
bufio.Scannerلقراءة أسطر المدخلات بشكل صحيح:- أنشئ ماسحاً ضوئياً:
scanner := bufio.NewScanner(os.Stdin) - لكل سطر مدخلات: استدعِ
scanner.Scan()ثمscanner.Text() - هذا يضمن قراءة أسماء المهام التي تحتوي على مسافات بشكل صحيح
- أنشئ ماسحاً ضوئياً:
- قم بتحليل بيانات المهام من المدخل الثاني لإنشاء شريحة المهام الخاصة بك:
- قسم المدخلات بواسطة الفواصل للحصول على إدخالات المهام الفردية
- لكل إدخال، قسم بواسطة النقطتين الرأسيتين لفصل الاسم والحالة
- حول سلسلة الحالة النصية إلى قيمة منطقية (
"true"تصبحtrue، و"false"تصبحfalse)
- حول سلسلة الفهرس النصية (المدخل الثالث) إلى عدد صحيح للحصول على فهرس المهمة
- استدعِ وظيفة
completeTaskمع مؤشر إلى شريحتك والفهرس - بعد إكمال المهمة، اعرض جميع المهام باستخدام نفس التنسيق من التحدي السابق:
- للمهام المكتملة:
"[x] [task_name]" - للمهام غير المكتملة:
"[ ] [task_name]"
- للمهام المكتملة:
- اطبع رسالة تأكيد:
"Task '[task_name]' marked as completed!" - اطبع الملخص المحدث:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
استخدم حزمة strconv لتحويل سلسلة الفهرس النصية إلى عدد صحيح. يوضح هذا التحدي كيف تمكنك مستقبلات المؤشرات من تعديل هيكل البيانات الأصلي، مما يؤدي إلى إجراء تغييرات دائمة على قائمة المهام الخاصة بك تستمر بعد انتهاء الوظيفة.
جرّب بنفسك
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
func viewAllTasks(tasks []Task) {
for _, task := range tasks {
if task.Completed {
fmt.Printf("[x] %s\n", task.Name)
} else {
fmt.Printf("[ ] %s\n", task.Name)
}
}
}
func main() {
var numTasksStr string
fmt.Scanln(&numTasksStr)
numTasks, _ := strconv.Atoi(numTasksStr)
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
taskData := scanner.Text()
var tasks []Task
taskEntries := strings.Split(taskData, ",")
for _, entry := range taskEntries {
parts := strings.Split(entry, ":")
if len(parts) >= 2 {
name := parts[0]
completed, _ := strconv.ParseBool(parts[1])
task := Task{
Name: name,
Completed: completed,
}
tasks = append(tasks, task)
}
}
viewAllTasks(tasks)
completedCount := 0
for _, task := range tasks {
if task.Completed {
completedCount++
}
}
incompleteCount := numTasks - completedCount
fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", numTasks, completedCount, incompleteCount)
}جميع دروس 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)ملخص - الأشكال والسلوكيات