# Skill Layer — Framework: Golang (Go)

File ini menginstruksikan AI tentang *best practices* spesifik untuk pemrograman backend dengan **Golang**. Gunakan skill ini agar AI menulis kode idiomatik Go yang berkinerja sangat tinggi, sederhana, dan tangguh (*robust*).

---

## Arsitektur & Paradigma Utama
- **Idiomatic Go:** Jangan memaksakan paradigma Object-Oriented konvensional (seperti hirarki *class* yang dalam) ke dalam Go. Gunakan *structs* dan *interfaces* kecil yang berfokus pada *behavior* (perilaku).
- **Struktur Proyek Standar:** Gunakan konvensi standar komunitas Go (contoh: direktori `cmd/` untuk entri aplikasi, `internal/` untuk kode *private*, dan `pkg/` untuk *library public*).
- **Pendekatan Standar (Standard Library):** Sebisa mungkin manfaatkan `net/http` bawaan Go untuk routing dan server sebelum bergantung pada framework besar eksternal, kecuali memang direkomendasikan (seperti menggunakan `Gin` atau `Echo` untuk kecepatan *development*).

## Standar Penulisan Kode
1. **Error Handling Terang-terangan:** Dilarang keras mengabaikan *error* menggunakan *blank identifier* (`_ = doSomething()`). Setiap *error* **wajib** diperiksa (`if err != nil`) dan dibungkus (*wrapped*) dengan konteks yang jelas menggunakan `fmt.Errorf("gagal mengambil data pengguna: %w", err)`.
2. **Context Passing:** Fungsi yang memanggil operasi *database*, *network*, atau operasi berat **wajib** menerima parameter `ctx context.Context` sebagai argumen pertama untuk memfasilitasi *timeout* dan pembatalan (*cancellation*).
3. **Konkurensi Aman (Goroutines & Channels):** Saat menggunakan *goroutine*, pastikan Anda tahu kapan dan bagaimana *goroutine* tersebut akan berhenti. Cegah *goroutine leaks*. Gunakan *WaitGroups* atau *Channels* untuk sinkronisasi, dan hindari perlombaan data (*data race*).
4. **Dependency Injection:** Masukkan dependensi (*database pool*, *logger*, konfigurasi) ke dalam *struct* (misal: *Handler struct*) saat inisialisasi, jangan gunakan variabel global secara sembarangan.

## Guardrails Keamanan & Performa
- Jangan memuat file atau dataset raksasa sekaligus ke dalam *memory* (RAM). Selalu gunakan operasi berbasis *Streaming* (seperti `io.Reader` dan `io.Writer`).
- Selalu atur *Timeout* pada `http.Client` dan pada konfigurasi koneksi *database* Anda. *Client* bawaan Go tidak memiliki *timeout* default, yang bisa menyebabkan aplikasi hang tanpa batas waktu.
