DEV Community

Aziz Fikri
Aziz Fikri

Posted on

Go Context dan Kenapa Itu Penting

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:

  1. Membatasi waktu yang dimiliki oleh sebuah proses.
  2. 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
Enter fullscreen mode Exit fullscreen mode

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())
    }
}
Enter fullscreen mode Exit fullscreen mode

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

  1. Tidak Menutup Context

    Selalu panggil defer cancel() setelah membuat Context. Hal ini dapat menyebabkan memory leak karena Context akan terus tersimpan dalam memory.

  2. 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?

  1. HTTP Request: Membatalkan permintaan jika user sudah tidak membutuhkan response-nya.
  2. Operasi Database: Menghentikan query jika terlalu lama.
  3. 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)