Go Context dan Kenapa Itu Penting
Context
adalah sebuah standard library yang ada dalam bahasa pemrograman Go. Context
membantu kita untuk mengelola cancellation (pembatalan), timeouts (pembatasan waktu), dan propagating data (penyaluran data-data) yang dibutuhkan. Dalam postingan ini kita akan mencoba untuk memahami Context
dan kenapa kita harus menggunakan Context
dalam aplikasi kita. Pada akhir dari postingan ini kita akan mencoba menggunakan Context
secara sederhana.
Apa Itu Context?
Kita dapat membayangkan Context
seperti lampu lalu lintas. Misalnya, saat lampu berwarna hijau itu sama dengan saat kita memulai Context
. Kemudian waktu mundur yang dihitung sama seperti saat kita menggunakan Context
dengan timeout. Saat lampu merah menyala, maka Context
akan mengirimkan sinyal done untuk menghentikan lalu lintas yang berjalan.
Berdasarkan analogi diatas, kita dapat menyimpulkan bahwa Context
memiliki beberapa peran penting yaitu:
- Membatasi waktu yang dimiliki oleh sebuah proses.
- Membatalkan proses yang sedang berjalan dan sudah tidak diperlukan lagi.
Cara Kerja Context
Hierarki Context
Context
memiliki hierarki dalam pengelolaannya. Kita dapat membuat Context
dengan berdiri sendiri atau kita dapat membuat Context
dengan menggunakan Context
lainnya sebagai parent. Saat kita menandai sebuah Context
sebagai selesai, maka seluruh Context
yang berada dibawahnya (children) akan ikut terhenti.
Berikut diagram sederhana yang menggambarkan hierarki dari sebuah Context
:
Root Context
├── Context A
│ ├── Context A1
│ └── Context A2
└── Context B
Contoh Penggunaan Context
Berikut adalah cara menggunakan Context
secara sederhana, dari contoh dibawah ini kita dapat melihat dimana kita membuat Context
dengan timeout sehingga jika proses berjalan dengan waktu lebih dari timeout yang ditentukan maka Context
akan mengirimkan sinyal Done
.
package main
import (
"context"
"fmt"
"time"
)
func main() {
// Membuat context dengan timeout
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
// Menjalankan fungsi dengan context
process(ctx)
}
func process(ctx context.Context) {
select {
case <-time.After(3 * time.Second):
fmt.Println("Proses selesai")
case <-ctx.Done():
fmt.Println("Proses dibatalkan:", ctx.Err())
}
}
Penjelasan:
-
context.WithTimeout
: Membuat context dengan batas waktu 2 detik. -
ctx.Done()
: Mendengar sinyal pembatalan jika waktu habis. -
select
: Berfungsi untuk memilih channel yang mana yang memberikan data terlebih dahulu.
Kesalahan Umum
-
Tidak Menutup Context
Selalu panggil
defer cancel()
setelah membuatContext
. Hal ini dapat menyebabkan memory leak karenaContext
akan terus tersimpan dalam memory. -
Menggunakan Context untuk Data yang Tidak Relevan
Jangan gunakan
Context
sebagai pengganti parameter dari sebuah fungsi. Gunakan hanya untuk pembatalan, timeout, atau metadata.
Kapan Harus Menggunakan Context?
- HTTP Request: Membatalkan permintaan jika user sudah tidak membutuhkan response-nya.
- Operasi Database: Menghentikan query jika terlalu lama.
- Goroutine: Membatalkan proses paralel yang tidak dibutuhkan lagi.
Kesimpulan
Memahami dan menggunakan Context
dengan tepat akan membantu kita membangun aplikasi Go yang lebih efisien. Melalui kemampuannya mengelola cancellation, timeout, dan data propagation, Context
menjaga aplikasi kita tetap terkendali dalam situasi kompleks. Sebagai developer, kita perlu mengimplementasikan Context
dalam setiap aplikasi Go untuk meningkatkan kualitas dan skalabilitasnya.
Top comments (0)