Mengapa context.Context Ada
Pembatalan dan pengelolaan siklus hidup permintaan
Mengapa context.Context Ada adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 1 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.
Masalahnya
Tanpa mekanisme untuk membatalkan pekerjaan yang sedang berlangsung, kueri basis data atau panggilan HTTP yang lambat akan membuat goroutinenya terblokir hingga selesai. Hal ini membuang sumber daya ketika permintaan awal sudah dibatalkan.
Gambaran umum context.Context
context.Context adalah interface yang membawa sinyal pembatalan, tenggat opsional, dan metadata kunci-nilai melintasi batas API dan goroutine.
type Context interface {
Deadline() (deadline time.Time, ok bool)
Done() <-chan struct{}
Err() error
Value(key any) any
}Kanal Done
ctx.Done() mengembalikan kanal yang ditutup ketika konteks dibatalkan atau batas waktunya tercapai. Goroutine melakukan select terhadap kanal ini untuk mendeteksi pembatalan.
select {
case result := <-workCh:
return result, nil
case <-ctx.Done():
return nil, ctx.Err()
}context.Background()
context.Background() adalah konteks akar—tidak pernah dibatalkan, tidak memiliki tenggat, dan tidak membawa nilai. Gunakan di awal permintaan, dalam main, atau dalam pengujian.
context.TODO()
context.TODO() juga merupakan konteks akar yang tidak dapat dibatalkan, digunakan sebagai placeholder ketika konteks yang tepat belum tersedia. Ini menyampaikan maksud kepada peninjau.
Mengapa Context diteruskan sebagai argumen pertama?
Menurut konvensi, parameter pertama dari setiap fungsi yang dapat dibatalkan adalah ctx context.Context. Hal ini membuat pembatalan menjadi eksplisit dan mudah ditemukan dalam API.
func FetchUser(ctx context.Context, id int) (*User, error) {
return db.QueryContext(ctx, "SELECT ...", id)
}Pembatalan diteruskan
Membatalkan konteks induk akan membatalkan semua konteks turunan. Dengan demikian, satu pemanggilan pembatalan dapat menghentikan seluruh pohon goroutine dan operasi.
Hal yang bukan merupakan Context
Context bukan wadah nilai serbaguna—gunakan hanya untuk data dengan lingkup permintaan seperti ID pelacakan atau token autentikasi, bukan untuk parameter opsional. Simpan nilai dalam struct bertipe.
Integrasi dengan pustaka standar
Klien HTTP, pengandar SQL, gRPC, dan banyak paket pihak ketiga dalam pustaka standar menerima Context, sehingga pembatalan dapat diteruskan melalui seluruh tumpukan pemanggilan.
Menyimpan Context dalam struct
Jangan menyimpan Context di dalam struct. Teruskan secara eksplisit sebagai argumen fungsi. Menyimpannya membuat masa hidup pembatalan menjadi tidak jelas dan sering menyebabkan kesalahan.
Context tidak dapat diubah
Context tidak dapat diubah—Anda memperoleh konteks baru dengan membungkusnya menggunakan WithCancel, WithDeadline, WithTimeout, atau WithValue. Induknya tidak diubah.
Pemeriksaan singkat
Apa yang dikembalikan oleh ctx.Done()?
Ringkasan: context.Context
Poin penting:
- Membawa pembatalan, tenggat, dan metadata melintasi goroutine
- Teruskan sebagai argumen pertama; jangan pernah menyimpannya dalam struct
- Kanal ctx.Done() ditutup saat pembatalan atau batas waktu tercapai
- Pembatalan diteruskan dari induk ke semua konteks turunan
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengapa context.Context Ada” gratis?
Ya — teks lengkap “Mengapa context.Context Ada” 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 “Mengapa context.Context Ada”?
Pembatalan dan pengelolaan siklus hidup 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 1 dari 4.
Berapa lama pelajaran “Mengapa context.Context Ada” 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