השהיה וטיקרים
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-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`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה7טיפול בשגיאות לעומק
סוגי שגיאות מותאמים אישיתעטיפת שגיאות באמצעות `%w`חילוץ שגיאות באמצעות `errors.Is`חילוץ שגיאות באמצעות `errors.As`הבנת `panic`שימוש ב־`recover`סיכום — חלוקה בטוחה10עבודה עם זמן
קבלת הזמן הנוכחייצירת זמן מסויםעיצוב זמןניתוח מחרוזות זמןמשך זמןחישובים עם זמןהשהיה וטיקריםסיכום - טיימר פשוט2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאיתרגלו בעצמכם: קומפיילר Go אונליין