الانتظار والـ Tickers
جزء من قسم المنطق وتدفق التنفيذ في رحلة GO على Coddy. الدرس 64 من 68.
أحيانًا تحتاج إلى التحكم في توقيت تنفيذ برنامجك. توفر Go دالتين أساسيتين في حزمة time لهذا الغرض: time.Sleep لإيقاف التنفيذ مؤقتًا، وtime.NewTicker لتنفيذ إجراءات على فترات منتظمة.
تُوقِف الدالة time.Sleep برنامجك مؤقتًا لمدة محددة. تأخذ قيمة time.Duration كوسيط لها، وتحظر التنفيذ حتى انقضاء تلك المدة:
fmt.Println("Starting...")
time.Sleep(2 * time.Second)
fmt.Println("Two seconds have passed!")لتنفيذ الإجراءات المتكررة على فترات منتظمة، ينشئ time.NewTicker مؤقّتًا يرسل قيمًا عبر قناة على فواصل زمنية محددة. وهذا مفيد للمهام التي تحتاج إلى التنفيذ دوريًا:
ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
<-ticker.C // انتظر النبضة التالية
fmt.Println("Tick", i+1)
}تُعدّ دوال التوقيت هذه ضرورية لإنشاء التأخيرات، وتنفيذ المهلات الزمنية، وجدولة العمليات المتكررة في برامج Go الخاصة بك.
التحدي
سهلأنشئ مؤقّتًا لجلسة تأمل يستخدم time.Sleep لإنشاء فواصل بين التعليمات الإرشادية، ويوضح التحكم الأساسي في التوقيت في برامج Go.
ستتلقى مُدخلين:
- سلسلة تحتوي على خطوات التأمل بالتنسيق
"step1:duration,step2:duration,step3:duration"(مثلًا،"Breathe in:3,Hold:2,Breathe out:4") - سلسلة تحتوي على عدد الدورات المراد تكرارها (مثلًا،
"5")
مهمتك هي:
- حلّل المُدخل الأول بتقسيمه عند الفواصل للحصول على خطوات التأمل الفردية
- لكل خطوة، قسّمها عند النقطتين الرأسيتين لاستخراج التعليمة والمدة (بالثواني)
- حوّل سلاسل المدة إلى أعداد صحيحة باستخدام الحزمة
strconv - حوّل المُدخل الثاني إلى عدد صحيح للحصول على عدد الدورات
- اعرض ترويسة الجلسة:
"=== MEDITATION TIMER ===" - اعرض إعداد الجلسة:
"Starting meditation session with [number_of_cycles] cycles" - لكل دورة (بدءًا من الدورة 1):
- اعرض:
"--- Cycle [cycle_number] ---" - لكل خطوة تأمل:
- اعرض:
"[instruction]..." - استخدم
time.Sleepللتوقف للمدة المحددة (اضرب المدة فيtime.Millisecond، كما فيtime.Duration(duration) * time.Millisecond، لكي تنتهي الاختبارات بسرعة؛ سيظل الإخراج يعرض الثواني) - بعد التوقف، اعرض:
"[instruction] complete ([duration] seconds)"
- اعرض:
- بعد إكمال جميع الخطوات في الدورة، اعرض:
"Cycle [cycle_number] finished"
- اعرض:
- بعد اكتمال جميع الدورات، اعرض ملخص الجلسة:
"=== SESSION COMPLETE ===""Total cycles completed: [number_of_cycles]""Steps per cycle: [number_of_steps]""Total meditation time: [total_seconds] seconds"(مجموع مدد جميع الخطوات مضروبًا في عدد الدورات)
- اعرض رسالة الإكمال:
"Meditation session finished - well done!"
استخدم الحزمة time لعمليات التوقف، والحزمة strings لتقسيم سلاسل المُدخلات، والحزمة strconv لتحويل السلاسل إلى أعداد صحيحة، والحزمة fmt للإخراج. تذكّر أن time.Sleep تستقبل وسيطًا من النوع time.Duration، لذا حوّل العدد الصحيح أولًا: time.Duration(duration) * time.Millisecond. سيستخدم المؤقّت الحقيقي time.Second، لكن التوقف لثوانٍ كاملة يؤدي إلى انتهاء مهلة الاختبارات. يوضح هذا التحدي كيفية استخدام time.Sleep لإنشاء فواصل زمنية أثناء تنفيذ البرنامج لتطبيقات عملية مثل التأمل الإرشادي أو مؤقّتات التمارين.
جرّب بنفسك
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// اقرأ الإدخال باستخدام bufio.Scanner للتعامل مع المسافات بشكل صحيح
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
stepsInput := scanner.Text()
scanner.Scan()
cyclesInput := scanner.Text()
// حلّل خطوات التأمل والدورات
steps := strings.Split(stepsInput, ",")
cycles, _ := strconv.Atoi(cyclesInput)
// TODO: اكتب الكود الخاص بك أدناه
// حلّل كل خطوة لاستخراج التعليمة والمدة
// تذكّر التحقق من أن الشريحة parts تحتوي على عناصر كافية قبل الوصول إليها
// اعرض ترويسة الجلسة وإعداداتها
// كرّر المرور على الدورات والخطوات
// استخدم time.Sleep لفترات التوقف المؤقت: time.Duration(duration) * time.Millisecond
// اعرض رسائل الإكمال والملخص
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1تدفق التحكم المتقدم
جملة Switch مع `fallthrough`الخروج من الحلقات المتداخلةالاستمرار في حلقة محددةجملة `goto`ملخص - التحكم المتقدم في الحلقات7معالجة الأخطاء بعمق
أنواع الأخطاء المخصصةتغليف الأخطاء باستخدام `%w`فك التغليف باستخدام `errors.Is`فك التغليف باستخدام `errors.As`فهم `panic`استخدام `recover`ملخص - القسمة الآمنة10التعامل مع الوقت
الحصول على الوقت الحاليإنشاء وقت محددتنسيق الوقتتحليل النصوص الزمنيةالمدة الزمنيةالعمليات الحسابية على الوقتالانتظار والـ Tickersمراجعة - مؤقت بسيط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)ملخص - الأشكال والسلوكياتتدرّب بنفسك: مترجم Go عبر الإنترنت