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
- Mengapa context.Context Ada
- WithCancel dan WithTimeout
- WithDeadline dan WithValue
- Context dalam Pemanggilan HTTP dan Basis Data