𝗚𝗼 𝗖𝗼𝗻𝘁𝗲𝘅𝘁 𝗣𝗮𝗰𝗸𝗮𝗴𝗲
Sebagian besar pengembang Go menggunakan context.Context tanpa memahaminya. Anda dapat melihatnya di handler HTTP, panggilan database, dan metode SDK. Banyak pemula menggunakan context.Background() di mana-mana.
Kesalahan ini menyebabkan masalah. Fungsi Lambda mungkin menggantung melampaui batas waktunya (timeout). Kueri database mungkin terus berjalan setelah pengguna terputus.
Context memungkinkan Anda untuk mengirim sinyal pembatalan dan tenggat waktu (deadline) melalui kode Anda. Ini membantu Anda menjawab tiga pertanyaan:
• Apakah operasi ini harus terus berjalan? • Kapan operasi ini harus selesai? • Data permintaan apa yang mengalir bersama panggilan ini?
Interface Context memiliki empat metode:
- Deadline(): Mengembalikan kapan context akan dibatalkan.
- Done(): Mengembalikan sebuah channel yang tertutup saat context dibatalkan. Gunakan ini dalam pernyataan
selectuntuk menghentikan pekerjaan. - Err(): Mengembalikan alasan mengapa context berhenti (
DeadlineExceededatauCanceled). - Value(): Mengambil data cakupan permintaan (request-scoped) seperti Trace ID.
Context bekerja seperti sebuah pohon. Anda memulai dengan context induk (parent) dan membuat anak-anaknya (children).
Context Akar (Root Contexts):
- context.Background(): Gunakan ini di awal program Anda.
- context.TODO(): Gunakan ini sebagai placeholder selama proses refactoring.
Context Anak (Child Contexts):
- context.WithCancel(): Memungkinkan Anda untuk menghentikan pekerjaan secara manual.
- context.WithTimeout(): Menghentikan pekerjaan setelah durasi tertentu.
- context.WithDeadline(): Menghentikan pekerjaan pada waktu tertentu.
- context.WithValue(): Meneruskan metadata seperti User ID.
Aturan Penting: Selalu panggil fungsi cancel. Gunakan defer cancel() segera setelah membuat context anak. Jika Anda melewatkan hal ini, Anda akan menyebabkan kebocoran memori (memory leaks).
Praktik Terbaik:
- Teruskan context sebagai argumen pertama ke fungsi.
- Jangan simpan context di dalam struct.
- Gunakan
context.WithValuehanya untuk metadata, bukan untuk dependensi seperti klien database. - Periksa
ctx.Err()di dalam loop yang panjang untuk keluar lebih awal. - Gunakan tipe kustom untuk kunci (key) context guna menghindari tabrakan (collisions).
Ketika context induk dibatalkan, semua anaknya akan dibatalkan secara otomatis. Hal ini memudahkan untuk menghentikan seluruh rangkaian operasi di seluruh sistem Anda.