Ana içeriğe geç
Modül 8 · Ders 4 ders 5Kurstaki 39/50~12 min
Modül dersleri (4/5)

'Zaman' paketi

time paketi üç farklı konsepti modelliyor: anlıklar (time.Time), süreler (time.Duration) ve periyodik araçlar (zamanlayıcı, işaretleyici). Bunları ayırt etmek çok önemlidir: Bir an, zaman çizelgesindeki bir noktadır, süre ise bir aralıktır.

time.Time — anlar

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 değişmez: tüm Add, Truncate, Round yöntemleri yeni bir Time döndürür.

Anları karşılaştırmak için Before, After, Equal kullanın. Eğer anlar farklı zaman dilimlerine/monoton saatlere sahip olabiliyorsa == kullanmayın.

time.Duration — aralıklar

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

const timeout = 5 * time.Second

time.Duration, nanosaniye sayan int64 takma adıdır. time.Nanosecond, time.Microsecond, time.Millisecond, time.Second, time.Minute, time.Hour sabitleri Duration türündedir.

Ayrıştırma ve biçimlendirme: referans düzeni

Go, YYYY-MM-DD gibi dizeler kullanmaz. kanonik referans anlık kullanır:

Code
Mon Jan 2 15:04:05 MST 2006

yani 01/02 03:04:05PM '06 -0700. Bu düzeni ezberleyerek (anımsatıcı: 1-2-3-4-5-6-7) herhangi bir tarihi biçimlendirebilirsiniz:

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 hazır düzenler sunar: time.RFC3339 ("2006-01-02T15:04:05Z07:00"), time.RFC1123, time.Kitchen ("3:04PM").

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

Ölçüm süresi

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

time.Since monotonik saati kullanır: sistem saati ayarlamalarından (NTP, yaz saati uygulaması) etkilenmez. Performans ölçümleri için istediğiniz şey budur.

Zamanlayıcı ve Ticker

  • time.After(d), d'den sonra yalnızca bir kez alan bir chan time.Time döndürür. select'de kullanışlıdır:
Go
select {
case res := <-ch:
    fmt.Println("ok", res)
case <-time.After(2 * time.Second):
    return errors.New("timeout")
}
  • time.NewTimer(d) durdurulabilir bir türdür (t.Stop()).
  • time.NewTicker(d) her d tekrar tekrar gönderir. Goroutin sızıntılarını önlemek için defer ticker.Stop()'yi unutmayın.
Go
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for range ticker.C {
    fmt.Println("tick")
}

Egzersizler

Egzersiz#go.m8.l4.e1
Denemeler: 0Yükleniyor…

Geçerli anı zamana göre biçimlendirilmiş olarak yazdırın.RFC3339.

Düzenleyici yükleniyor…

3 denemeden sonra çözüm mevcut

Egzersiz#go.m8.l4.e2
Denemeler: 0Yükleniyor…

Bir sürenin ne kadar sürdüğünü ölçün. 10ms'lik uyku zaman alır.Sonucu yazdırın.

Düzenleyici yükleniyor…

3 denemeden sonra çözüm mevcut

Quiz#go.m8.l4.e3
Hazır

'time.Second' sabitinin türü nedir?

Go
d := time.Second
// d ha tipo ???
Cevap seçenekleri