0Pricing
Go Academy · Pelajaran

WithDeadline dan WithValue

Batas waktu absolut dan meneruskan nilai dalam cakupan permintaan

WithDeadline dan WithValue adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.

context.WithDeadline

WithDeadline membuat konteks yang dibatalkan pada waktu absolut tertentu. Jika induknya sudah memiliki tenggat yang lebih awal, tenggat induk tersebut yang berlaku.

deadline := time.Now().Add(10 * time.Second)
ctx, cancel := context.WithDeadline(parent, deadline)
defer cancel()

WithTimeout dibandingkan dengan WithDeadline

WithTimeout(parent, d) setara dengan WithDeadline(parent, time.Now().Add(d)). Gunakan WithDeadline jika Anda memiliki waktu kedaluwarsa absolut, misalnya dari tajuk RPC yang masuk.

Membaca tenggat waktu

Periksa tenggat waktu konteks apa pun dengan ctx.Deadline(). Nilai boolean menunjukkan apakah tenggat waktu tersedia.

if deadline, ok := ctx.Deadline(); ok {
    fmt.Println("expires at:", deadline)
}

context.WithValue

WithValue melampirkan pasangan kunci-nilai ke konteks. Kode di bagian hilir mengambilnya dengan ctx.Value(key).

type ctxKey string
const userKey ctxKey = "user"

ctx := context.WithValue(parent, userKey, currentUser)

func getUser(ctx context.Context) *User {
    u, _ := ctx.Value(userKey).(*User)
    return u
}

Mencegah benturan kunci

Gunakan tipe khusus paket yang tidak diekspor untuk kunci guna mencegah benturan antar-paket. Jangan pernah menggunakan tipe bawaan (string, int) secara langsung sebagai kunci konteks.

// Bad: string key can collide
ctx = context.WithValue(ctx, "user", u)
// Good: package-scoped type
type userKeyType struct{}
ctx = context.WithValue(ctx, userKeyType{}, u)

Yang disimpan dalam konteks

Simpan hanya nilai dengan cakupan permintaan yang melintasi batas API: ID pelacakan, token autentikasi, dan ID permintaan. Jangan menyimpan argumen fungsi opsional atau keadaan yang dapat diubah.

Performa WithValue

ctx.Value melakukan pencarian linear ke atas pada rantai konteks. Hindari menyimpan banyak nilai dalam setiap konteks; untuk beberapa nilai, kelompokkan semuanya dalam satu struktur.

type RequestMeta struct {
    UserID  int
    TraceID string
}
type metaKey struct{}
ctx = context.WithValue(ctx, metaKey{}, RequestMeta{...})

Meneruskan nilai melalui perantara

Perantara HTTP adalah tempat baku untuk melampirkan metadata permintaan ke konteks dan mengambilnya di dalam penangan:

func Auth(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        user := authenticate(r)
        ctx := context.WithValue(r.Context(), userKey, user)
        next.ServeHTTP(w, r.WithContext(ctx))
    })
}

r.WithContext

Ganti konteks permintaan HTTP dengan r.WithContext(ctx). Tindakan ini membuat salinan dangkal permintaan dengan konteks baru, sementara permintaan asli tetap tidak diubah.

Penerusan tenggat waktu

Ketika gerbang menetapkan tenggat waktu dalam konteks dan meneruskan permintaan ke bagian hilir, semua layanan yang menerima konteks tersebut secara otomatis mematuhi tenggat waktu tanpa logika batas waktu yang eksplisit.

Rantai konteks

Setiap WithValue, WithCancel, dan WithTimeout membungkus konteks induk dalam simpul baru. ctx.Value menelusuri rantai tersebut hingga menemukan kunci atau mencapai konteks akar yang mengembalikan nil.

Pemeriksaan Singkat

Mengapa kunci konteks sebaiknya berupa tipe khusus paket yang tidak diekspor?

Ringkasan: WithDeadline dan WithValue

Poin penting:

  • WithDeadline membatalkan pada waktu absolut; WithTimeout bersifat relatif
  • ctx.Deadline() membaca tenggat waktu
  • WithValue digunakan untuk metadata dengan cakupan permintaan; gunakan kunci bertipe yang tidak diekspor
  • Kelompokkan beberapa nilai dalam satu struktur untuk mengurangi kedalaman rantai

Pertanyaan yang Sering Diajukan

Apakah pelajaran “WithDeadline dan WithValue” gratis?

Ya — teks lengkap “WithDeadline dan WithValue” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “WithDeadline dan WithValue”?

Batas waktu absolut dan meneruskan nilai dalam cakupan permintaan Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Go Academy?

Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “WithDeadline dan WithValue” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mengapa context.Context Ada
  2. WithCancel dan WithTimeout
  3. WithDeadline dan WithValue
  4. Context dalam Pemanggilan HTTP dan Basis Data
← Kembali ke Go Academy