← Kembali ke kursus
Pelajaran kursus · Go
Pelajaran 37

Time Duration

Ukur dan hitung selisih waktu secara type-safe.

Pahami konsepnya

time.Duration adalah tipe khusus untuk rentang waktu — di balik layar int64 nanodetik, tetapi kamu hampir selalu menulisnya dengan konstanta yang terbaca manusiawi: 5*time.Second, 250*time.Millisecond, 2*time.Hour. Perkalian seperti itu adalah idiom, bukan kebetulan sintaks.

Operasi aritmatikanya lengkap: durasi bisa dijumlah, dikurang, dikalikan skalar, dibanding, dan dikonversi ke satuan lain lewat .Seconds(), .Milliseconds(), .Minutes(). Selisih dua waktu didapat lewat a.Sub(b) yang menghasilkan Duration; tanda negatif berarti a lebih awal.

Dua pemakaian utama: mengukur lama eksekusi (t0 := time.Now(); ...; time.Since(t0)) dan membatasi tunggu (timeout, TTL cache). time.Since(t0) adalah kependekan dari time.Now().Sub(t0) — dan hasilnya siap dicetak dengan %v yang otomatis memilih satuan terbaca ("1.5s", "2m30s").

Coba contoh kode

package main

import (
    "fmt"
    "time"
)

func main() {
    mulai := time.Now()
    time.Sleep(750 * time.Millisecond)
    fmt.Printf("lama: %v\n", time.Since(mulai))

    tugas := 2*time.Hour + 30*time.Minute
    fmt.Println(tugas, "=", tugas.Minutes(), "menit")
}

time.Since(mulai) mengukur rentang eksekusi — cetakan %v otomatis menampilkan "750.123ms" dalam satuan yang enak dibaca. Konstanta Duration bisa dijumlah langsung (2 jam + 30 menit) lalu dikonversi ke menit lewat .Minutes().

Membandingkan durasi

func lambatKah(proses func()) bool {
    mulai := time.Now()
    proses()
    return time.Since(mulai) > 500*time.Millisecond
}

func main() {
    fmt.Println(lambatKah(func() { time.Sleep(80 * time.Millisecond) })) // false
    fmt.Println(lambatKah(func() { time.Sleep(900 * time.Millisecond) })) // true
}

Duration dibandingkan dengan operator biasa (> < ==) karena tipenya teratur. Fungsi pembungkus seperti ini mengubah pengukuran waktu menjadi keputusan program: melewati ambang 500 ms berarti "lambat" — pintu masuk sederhana menuju monitoring dan circuit breaker.

Latihan singkat

Uji: ukur pengurutan 10.000 angka — bila durasinya di bawah 1 detik program harus mencetak persis `cepat`, selain itu `lambat`.