דילוג לתוכן המרכזי
מודול 8 · שיעור 4 מתוך 539/50 בקורס~12 min
שיעורי מודול (4/5)

חבילת ה'זמן'

חבילת time מדגמנת שלושה מושגים נפרדים: מיידיות (time.Time), משכי זמן (time.Duration) וכלים תקופתיים ​​(טיימר, טיקר). ההבחנה ביניהם היא קריטית: רגע הוא נקודה על ציר הזמן, משך זמן הוא מרווח.

time.Time — מיידיות

Go
now := time.Now()                // current instant in the local timezone
utc := now.UTC()                 // same instant in UTC
later := now.Add(2 * time.Hour)  // add a duration
diff := later.Sub(now)           // 2h0m0s (it's a Duration)

fmt.Println(now.Year(), now.Month(), now.Day())
fmt.Println(now.Weekday())

time.Time הוא בלתי ניתן לשינוי: כל השיטות Add, Truncate, Round מחזירות Time חדש.

כדי להשוות מיידיות השתמש ב-Before, After, Equal. אל תשתמש ב-== אם לרגעים יכולים להיות אזורי זמן שונים/שעונים מונוטוניים.

time.Duration — מרווחים

Go
d := 250 * time.Millisecond
fmt.Println(d)         // 250ms
fmt.Println(d.Seconds()) // 0.25 (float64)

const timeout = 5 * time.Second

time.Duration הוא כינוי של int64 שסופר ננו-שניות. הקבועים time.Nanosecond, time.Microsecond, time.Millisecond, time.Second, time.Minute, time.Hour הם מסוג _2IN.

ניתוח ועיצוב: פריסת ההפניה

Go לא משתמש במחרוזות כמו YYYY-MM-DD. הוא משתמש במיידי התייחסות קנוני:

Code
Mon Jan 2 15:04:05 MST 2006

כלומר 01/02 03:04:05PM '06 -0700. על ידי שינון פריסה זו (זכרון: 1-2-3-4-5-6-7) תוכל לעצב כל תאריך:

Go
const layout = "2006-01-02 15:04:05"
s := time.Now().Format(layout)            // "2026-05-16 14:30:00"
t, err := time.Parse(layout, "2026-05-16 14:30:00")

ה-stdlib מציע פריסות מוכנות: time.RFC3339 ("2006-01-02T15:04:05Z07:00"), time.RFC1123, time.Kitchen ("3:04PM").

Go
fmt.Println(time.Now().Format(time.RFC3339))

מדידת זמן

Go
start := time.Now()
work()
elapsed := time.Since(start)  // = time.Now().Sub(start)
fmt.Println("ci ha messo", elapsed)

time.Since משתמש ב-שעון מונוטוני: הוא אינו מוטרד מההתאמות של שעון המערכת (NTP, שעון קיץ). עבור מדידות ביצועים זה מה שאתה רוצה.

טיימר וטיקר

  • time.After(d) מחזיר chan time.Time שמקבל פעם אחת בלבד לאחר d. שימושי בselect:
Go
select {
case res := <-ch:
    fmt.Println("ok", res)
case <-time.After(2 * time.Second):
    return errors.New("timeout")
}
  • time.NewTimer(d) הוא גרסה הניתנת לעצירה (t.Stop()).
  • time.NewTicker(d) שולח שוב ושוב כל d. זכור defer ticker.Stop() כדי למנוע דליפות של גורוטין.
Go
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for range ticker.C {
    fmt.Println("tick")
}

תרגילים

פעילות גופנית#go.m8.l4.e1
ניסיונות: 0טוען...

הדפס את המיידי הנוכחי המעוצב לפי הזמן.RFC3339.

טוען עורך...

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#go.m8.l4.e2
ניסיונות: 0טוען...

למדוד כמה זמן זמן.שינה של 10ms לוקחת תוך שימוש בזמן.מאז והדפיסו את התוצאה.

טוען עורך...

הפתרון זמין לאחר 3 ניסיונות

Quiz#go.m8.l4.e3
מוכן

איזה סוג הוא ה-'time.Second' הקבוע?

Go
d := time.Second
// d ha tipo ???
אפשרויות תשובה