حذف مهمة
جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 24 من 68.
التحدي
سهلفي هذا الجزء من نظام إدارة المهام الخاص بك، ستقوم بتنفيذ القدرة على إزالة المهام من قائمتك. يركز هذا التحدي على معالجة الشرائح (slices) باستخدام دالة append لإعادة بناء شريحة بدون عنصر معين، مما يوضح كيفية إزالة العناصر نهائياً من هيكل البيانات الخاص بك.
ستتلقى ثلاثة مدخلات:
- سلسلة نصية تمثل عدد المهام (مثلاً،
"4") - سلسلة نصية تحتوي على بيانات المهام بالتنسيق التالي:
"name1:status1,name2:status2,name3:status3"حيث تكون الحالة إما"true"أو"false"(مثلاً،"Buy groceries:false,Call dentist:true,Finish project:false,Review code:true") - سلسلة نصية تمثل فهرس (index) المهمة المراد إزالتها (مثلاً،
"1"للمهمة الثانية، باستخدام الفهرسة التي تبدأ من الصفر)
مهمتك هي:
- تعريف نفس هيكل
Taskمن التحديات السابقة مع حقولName(string) وCompleted(bool) - إنشاء دالة تسمى
removeTaskتأخذ شريحة من هياكلTaskوفهرساً (int) كمعاملات - داخل دالة
removeTask، قم بإرجاع شريحة جديدة مع إزالة المهمة الموجودة عند الفهرس المعطى باستخدامappendلدمج العناصر التي تسبق الفهرس المستهدف والتي تليه - تحليل بيانات المهام من المدخل الثاني لإنشاء شريحة المهام الخاصة بك:
- تقسيم المدخل بواسطة الفواصل للحصول على إدخالات المهام الفردية
- لكل إدخال، قم بالتقسيم بواسطة النقطتين الرأسيتين لفصل الاسم والحالة
- تحويل سلسلة الحالة النصية إلى قيمة منطقية (
"true"تصبحtrue، و"false"تصبحfalse)
- تحويل سلسلة المدخل الثالث النصية إلى عدد صحيح للحصول على فهرس المهمة
- تخزين اسم المهمة المراد إزالتها قبل استدعاء دالة
removeTask - استدعاء دالة
removeTaskمع الشريحة والفهرس الخاصين بك، وتخزين الشريحة المرتجعة - بعد إزالة المهمة، قم بعرض جميع المهام المتبقية باستخدام نفس التنسيق من التحديات السابقة:
- للمهام المكتملة:
"[x] [task_name]" - للمهام غير المكتملة:
"[ ] [task_name]"
- للمهام المكتملة:
- طباعة رسالة تأكيد:
"Task '[task_name]' removed successfully!" - طباعة الملخص المحدث:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
استخدم حزمة strconv لتحويل سلسلة الفهرس النصية إلى عدد صحيح. يوضح هذا التحدي كيفية استخدام append لإعادة بناء الشرائح عن طريق دمج الأجزاء قبل وبعد العنصر المستهدف، مما يؤدي بفعالية إلى إزالة العناصر من مجموعتك مع الحفاظ على ترتيب العناصر المتبقية.
جرّب بنفسك
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
func completeTask(tasks *[]Task, index int) {
(*tasks)[index].Completed = true
}
func main() {
// Read input using bufio.Scanner to handle spaces properly
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
_ = scanner.Text() // Read but don't use the number of tasks
scanner.Scan()
taskDataStr := scanner.Text()
scanner.Scan()
indexStr := scanner.Text()
// Parse task data
taskEntries := strings.Split(taskDataStr, ",")
tasks := make([]Task, len(taskEntries))
for i, entry := range taskEntries {
parts := strings.Split(entry, ":")
if len(parts) >= 2 {
name := parts[0]
status := parts[1] == "true"
tasks[i] = Task{Name: name, Completed: status}
}
}
// Convert index string to integer
index, _ := strconv.Atoi(indexStr)
// Complete the task
taskName := tasks[index].Name
completeTask(&tasks, index)
// Display all tasks
for _, task := range tasks {
if task.Completed {
fmt.Printf("[x] %s\n", task.Name)
} else {
fmt.Printf("[ ] %s\n", task.Name)
}
}
// Print confirmation message
fmt.Printf("Task '%s' marked as completed!\n", taskName)
// Count completed and incomplete tasks
completedCount := 0
for _, task := range tasks {
if task.Completed {
completedCount++
}
}
incompleteCount := len(tasks) - completedCount
// Print summary
fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", len(tasks), 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)ملخص - الأشكال والسلوكيات