יצירת זמן מסוים
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 59 מתוך 68.
בעוד ש-time.Now() נותנת לך את הרגע הנוכחי, לעיתים קרובות תצטרך לעבוד עם תאריכים ושעות מסוימים. Go מספקת את הפונקציה time.Date ליצירת אובייקט time.Time שמייצג כל תאריך ושעה שתציין.
הפונקציה time.Date מקבלת שמונה פרמטרים בסדר המדויק הזה: שנה, חודש, יום, שעה, דקה, שנייה, ננו־שנייה ומיקום. הנה התחביר הבסיסי:
birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)שימו לב ש-Go משתמשת בקבועים כמו time.March עבור חודשים, מה שהופך את הקוד שלכם לקריא יותר מאשר שימוש במספרים. אפשר גם להשתמש במספרים שלמים (1-12), אם מעדיפים. בדרך כלל, הפרמטר location משתמש ב-time.UTC עבור זמן UTC או ב-time.Local עבור אזור הזמן המקומי של המערכת שלכם.
הגישה הזו מעניקה לך שליטה מלאה ביצירת כל רגע ספציפי בזמן, בין אם מדובר ביום הולדת, במועד אחרון או בתאריך היסטורי. אובייקט time.Time שנוצר פועל בדיוק כמו זה שמתקבל מ־time.Now(), ואפשר להשתמש בו עם כל אותן פעולות הזמן.
אתגר
קלצרו יישום של ציר זמן לאירועים היסטוריים, שמשתמש ב־time.Date כדי לייצג תאריכים ושעות מסוימים מההיסטוריה. האתגר הזה יבדוק את היכולת שלכם ליצור אובייקטים מסוג time.Time עבור רגעים היסטוריים מדויקים ולהציג אותם בפורמט מסודר.
תקבלו שתי קלטים:
- מחרוזת שמכילה אירועים היסטוריים בפורמט
"event1:year:month:day:hour:minute,event2:year:month:day:hour:minute"(למשל,"Moon Landing:1969:7:20:20:17,Berlin Wall Fall:1989:11:9:21:0") - מחרוזת שמכילה אפשרויות תצוגה המופרדות בפסיקים, בפורמט
"option1,option2,option3"(למשל,"chronological,details,summary")
עליכם לבצע את הפעולות הבאות:
- נתחו את הקלט הראשון באמצעות פיצול לפי פסיקים כדי לקבל רשומות של אירועים נפרדים
- עבור כל רשומת אירוע, פצלו לפי נקודתיים כדי לחלץ את שם האירוע, השנה, החודש, היום, השעה והדקה
- המירו את המחרוזות המספריות למספרים שלמים וצרו אובייקט
time.Timeבאמצעותtime.Dateעבור כל אירוע (השתמשו ב־time.UTCכפרמטר המיקום וב־0 עבור השניות והננו־שניות) - הציגו את כותרת היישום:
"=== HISTORICAL TIMELINE APPLICATION ===" - הציגו אישור על טעינת האירועים:
"Loading historical events..." - עבור כל אירוע, הציגו:
"Loaded: [event_name] - [complete_time_object]" - נתחו את הקלט השני באמצעות פיצול לפי פסיקים כדי לקבל את אפשרויות התצוגה
- עבדו כל אפשרות תצוגה:
- עבור
"chronological": הציגו את"=== CHRONOLOGICAL ORDER ==="ולאחריו את האירועים ממוינים לפי תאריך (מהמוקדם ביותר למאוחר ביותר), בפורמט"[event_name]: [year]-[month]-[day] at [hour]:[minute] UTC" - עבור
"details": הציגו את"=== DETAILED INFORMATION ==="ולאחריו את פרטי כל אירוע:"Event: [event_name]"" Date: [year]-[month]-[day]"" Time: [hour]:[minute] UTC"" Weekday: [weekday_name]"" Unix timestamp: [unix_seconds]"
- עבור
"summary": הציגו את"=== TIMELINE SUMMARY ==="ולאחריו:"Total events: [number_of_events]""Earliest event: [earliest_event_name] ([year])""Latest event: [latest_event_name] ([year])""Time span: [years_between_earliest_and_latest] years"
- עבור
"years": הציגו את"=== EVENTS BY DECADE ==="ולאחריו אירועים מקובצים לפי עשור, בפורמט"[decade]s: [comma_separated_event_names]" - הציגו את הודעת הסיום:
"Historical timeline processing completed"
השתמשו בחבילה time כדי ליצור תאריכים מסוימים באמצעות time.Date, בחבילה strings כדי לפצל מחרוזות קלט, בחבילה strconv כדי להמיר מספרים במחרוזות למספרים שלמים, ובחבילה fmt כדי להפיק פלט מעוצב. זכרו שהפרמטרים של time.Date מופיעים בסדר המדויק הבא: שנה, חודש, יום, שעה, דקה, שנייה, ננו־שנייה, מיקום. כדי למיין לפי סדר כרונולוגי, אפשר להשוות בין אובייקטים מסוג time.Time באמצעות המתודה Before(). האתגר הזה מדגים כיצד ליצור רגעים מסוימים בזמן ולעבוד עם נתונים היסטוריים באמצעות יכולות הזמן של Go.
נסו בעצמכם
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// קראו את הקלט באמצעות bufio.Scanner כדי לטפל ברווחים כראוי
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
eventsInput := scanner.Text()
scanner.Scan()
optionsInput := scanner.Text()
// נתחו את האירועים מתוך הקלט
eventEntries := strings.Split(eventsInput, ",")
// נתחו את אפשרויות התצוגה מתוך הקלט
displayOptions := strings.Split(optionsInput, ",")
// TODO: כתבו את הקוד שלכם למטה
// 1. נתחו כל רשומת אירוע כדי לחלץ שם, שנה, חודש, יום, שעה ודקה
// 2. זכרו לבדוק שיש ב־parts slice מספיק איברים לפני הגישה אליהם
// 3. המירו מספרים המיוצגים כמחרוזות למספרים שלמים באמצעות strconv.Atoi()
// 4. צרו אובייקטים מסוג time.Time באמצעות time.Date() עבור כל אירוע
// 5. הציגו את כותרת היישום ואת הודעות הטעינה
// 6. טפלו בכל אפשרות תצוגה (כרונולוגית, פרטים, סיכום, שנים)
// 7. הציגו את הודעת הסיום
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה7טיפול בשגיאות לעומק
סוגי שגיאות מותאמים אישיתעטיפת שגיאות באמצעות `%w`חילוץ שגיאות באמצעות `errors.Is`חילוץ שגיאות באמצעות `errors.As`הבנת `panic`שימוש ב־`recover`סיכום — חלוקה בטוחה10עבודה עם זמן
קבלת הזמן הנוכחייצירת זמן מסויםעיצוב זמןניתוח מחרוזות זמןמשך זמןחישובים עם זמןהשהיה וטיקריםסיכום - טיימר פשוט2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאיתרגלו בעצמכם: קומפיילר Go אונליין