WithCancel dan WithTimeout
Membuat konteks yang dapat dibatalkan dan memiliki batas waktu
WithCancel dan WithTimeout adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.WithCancel
WithCancel menghasilkan konteks baru dengan fungsi pembatalan. Memanggil fungsi pembatalan akan menutup kanal Done pada konteks turunan dan semua turunannya.
ctx, cancel := context.WithCancel(parent)
defer cancel() // always call to release resources
go doWork(ctx)Selalu gunakan defer cancel
Jika tidak memanggil cancel, goroutine yang memantau konteks induk akan bocor. Selalu gunakan defer cancel segera setelah membuat konteks yang dapat dibatalkan.
context.WithTimeout
WithTimeout menghasilkan konteks yang dibatalkan secara otomatis setelah durasi yang ditentukan. Ini adalah pembungkus praktis di sekitar WithDeadline.
ctx, cancel := context.WithTimeout(parent, 5*time.Second)
defer cancel()
if err := db.QueryContext(ctx, query); err != nil {
// err may be context.DeadlineExceeded
}Memeriksa Err()
Setelah Done ditutup, ctx.Err() mengembalikan alasannya: context.Canceled (dibatalkan secara eksplisit) atau context.DeadlineExceeded (batas waktu tercapai).
if err := ctx.Err(); errors.Is(err, context.DeadlineExceeded) {
log.Println("timeout")
}Membatalkan dari goroutine lain
Fungsi pembatalan aman dipanggil dari goroutine mana pun dan secara bersamaan dari beberapa goroutine. Hanya pemanggilan pertama yang berpengaruh.
ctx, cancel := context.WithCancel(context.Background())
go func() {
if detectError() { cancel() }
}()Batas waktu permintaan HTTP
Tetapkan batas waktu per permintaan dengan WithTimeout pada konteks permintaan yang masuk:
func handler(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second)
defer cancel()
result, err := service.Call(ctx)
// ...
}Pembatalan berantai
Jika konteks induk dibatalkan, semua konteks turunan (anak dan cucu) akan dibatalkan secara otomatis, sehingga semua goroutine dalam pohon pemanggilan berhenti.
Context dalam pengujian
Gunakan context.Background() atau context.WithTimeout dalam pengujian untuk memastikan goroutine yang dimulai oleh pengujian memiliki batas waktu.
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
testResult := runTest(ctx)Meneruskan konteks melalui pustaka
Selalu teruskan konteks yang Anda terima ke panggilan keluar (kueri basis data, panggilan HTTP, RPC). Jangan pernah membuang atau menggantinya kecuali Anda memiliki alasan khusus untuk mengatur ulang tenggat.
Membuat konteks untuk pekerjaan latar belakang
Untuk pekerjaan latar belakang yang tidak terkait dengan permintaan, gunakan context.Background() sebagai akar dan tambahkan WithCancel agar pekerjaan tersebut dapat dihentikan dengan baik.
select dengan Done
Selalu lakukan select terhadap ctx.Done() bersama kanal kerja agar tidak terblokir ketika konteks dibatalkan sebelum pekerjaan selesai.
select {
case result := <-workCh:
return result, nil
case <-ctx.Done():
return nil, ctx.Err()
}Pemeriksaan singkat
Apa perbedaan antara context.WithCancel dan context.WithTimeout?
Ringkasan: WithCancel dan WithTimeout
Poin penting:
- Selalu gunakan defer cancel() segera setelah membuatnya
- WithTimeout membatalkan secara otomatis setelah durasi tertentu; mengembalikan DeadlineExceeded
- ctx.Err() membedakan Canceled dan DeadlineExceeded
- Pembatalan diteruskan ke semua konteks turunan
Pertanyaan yang Sering Diajukan
Apakah pelajaran “WithCancel dan WithTimeout” gratis?
Ya — teks lengkap “WithCancel dan WithTimeout” 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 “WithCancel dan WithTimeout”?
Membuat konteks yang dapat dibatalkan dan memiliki batas waktu 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 2 dari 4.
Berapa lama pelajaran “WithCancel dan WithTimeout” 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