الانتظار والـ Tickers
جزء من قسم Logic & Flow في رحلة 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 يرسل القيم عبر قناة (channel) على فترات زمنية محددة. هذا مفيد للمهام التي تحتاج إلى التشغيل بشكل دوري:
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.Durationعن طريق الضرب فيtime.Second) - بعد التوقف، اعرض:
"[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.Second لإنشاء قيمة المدة المناسبة. يوضح هذا التحدي كيفية استخدام time.Sleep لإنشاء فترات توقف زمنية في تنفيذ البرنامج للتطبيقات العملية مثل التأمل الموجه أو مؤقتات التمارين الرياضية.
ورقة مرجعية
استخدم time.Sleep لإيقاف تنفيذ البرنامج مؤقتًا لمدة محددة:
time.Sleep(2 * time.Second)استخدم time.NewTicker للقيام بإجراءات على فترات منتظمة:
ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
<-ticker.C // انتظر التكة التالية
fmt.Println("Tick", i+1)
}تستخدم كلتا الدالتين قيم time.Duration. قم بتحويل الأعداد الصحيحة إلى مدة زمنية عن طريق الضرب في time.Second.
جرّب بنفسك
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: اكتب الكود الخاص بك أدناه
// تحليل كل خطوة لاستخراج التعليمات والمدة
// تذكر التحقق مما إذا كانت شريحة الأجزاء تحتوي على عناصر كافية قبل الوصول إليها
// عرض ترويسة الجلسة والإعداد
// التكرار عبر الدورات والخطوات
// استخدم time.Sleep للتوقف المؤقت (فكر في استخدام المللي ثانية للاختبار)
// عرض رسائل الإكمال والملخص
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
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)ملخص - الأشكال والسلوكيات