Iter Package
Apa Itu pkg/iter?
pkg/iter?Singkatnya, pkg/iter adalah paket bantu yang memungkinkan Anda membuat iterator kustom dengan sangat mudah.
Di Go 1.22+, loop for...range mendapat kemampuan baru: ia bisa melakukan looping pada sebuah fungsi. Paket iter adalah alat standar untuk membuat fungsi-fungsi tersebut.
Ini memungkinkan Anda menulis kode yang lebih bersih dan efisien (terutama dalam hal memori) untuk logika perulangan yang kompleks.
Paket ini memberi kita dua "cetakan" iterator utama:
iter.Seq[V]: Untuk iterator yang menghasilkan satu nilai (misalnyastringatauint).iter.Seq2[K, V]: Untuk iterator yang menghasilkan dua nilai, yaitu key dan value (mirip seperti map).
Konsep Inti: Fungsi Ajaib yield
yieldKekuatan utama dari pkg/iter ada pada satu konsep: fungsi yield (artinya "menghasilkan" atau "memberikan").
Pikirkan yield sebagai cara iterator Anda untuk "mengirim" satu nilai kembali ke loop for...range.
Iterator kustom Anda akan menerima fungsi
yieldsebagai parameter.Setiap kali Anda memanggil
yield(value)di dalam iterator, nilai tersebut "dikirim" dan diterima oleh variabel loop Anda.yieldjuga mengembalikanbool. Ini adalah sinyal dari loop di luar.Jika
yieldmengembalikantrue, itu artinya loop masih berjalan dan Anda bisa lanjut.Jika
yieldmengembalikanfalse, itu artinya loop di luar bilang "Stop!" (misalnya karenabreakataureturn). Iterator Anda wajib berhenti saat itu juga.
Membuat Iterator Kustom
Mari kita lihat tiga contoh, dari yang paling sederhana hingga yang menggunakan key-value.
Contoh 1: iter.Seq[V] - Generator Angka
iter.Seq[V] - Generator AngkaMari kita buat iterator Count(n) yang menghasilkan angka dari 1 sampai n.
Contoh 2: iter.Seq[V] - Adapter Slice Terbalik
iter.Seq[V] - Adapter Slice TerbalikAnda bisa membuat "adapter" untuk tipe data yang sudah ada. Mari kita buat iterator untuk slice tapi secara terbalik.
Contoh 3: iter.Seq2[K, V] - Iterator Key-Value
iter.Seq2[K, V] - Iterator Key-ValueSekarang, mari kita buat iterator yang menghasilkan field dan value dari sebuah struct. Kita akan pakai iter.Seq2.
Best Practice dan Aturan Penggunaan
Karena fitur ini sudah stabil, berikut adalah aturan kapan harus (dan tidak harus) menggunakannya.
1. Kapan Harus Digunakan?
Gunakan iter saat Anda membutuhkan Evaluasi Malas (Lazy Evaluation).
Artinya, Anda hanya memproses data tepat saat dibutuhkan, satu per satu, tanpa memuat semuanya ke memori sekaligus.
Generator: Menghasilkan urutan angka (misal: Fibonacci) tanpa batas, tanpa harus menyimpannya di slice raksasa.
Data Streaming: Membaca file 10GB baris per baris. Anda tidak mau memuat 10GB itu ke RAM. Iterator akan
yieldsatu baris, memori bebas, laluyieldbaris berikutnya.Menyembunyikan Kompleksitas: Anda punya struktur data rumit (seperti Tree atau Graph). Anda bisa buat metode
.Nodes()yang mengembalikaniter.Seq[Node]untuk menyembunyikan logika traversal yang rumit di dalamnya.
2. Kapan TIDAK Boleh Digunakan? (Performa)
Jangan over-engineering. Jika Anda hanya perlu looping slice atau map biasa, selalu gunakan for...range standar.
Alasan: Setiap panggilan yield adalah sebuah function call, yang memiliki overhead performa kecil. Loop for...range standar di slice atau map dioptimalkan habis-habisan oleh compiler Go dan akan selalu lebih cepat.
3. WAJIB: Selalu Patuhi Sinyal yield
yieldIni adalah aturan paling penting. Selalu cek nilai bool yang dikembalikan yield.
Jika Anda mengabaikannya, loop Anda akan terus berjalan bahkan setelah pemanggil melakukan break, yang bisa menyebabkan bug atau kebocoran sumber daya.
4. Error Handling
Ini adalah bagian yang sedikit tricky: yield tidak bisa mengembalikan error.
Jadi, bagaimana jika iterator Anda gagal di tengah jalan (misal, koneksi jaringan putus)?
Pola Terbaik: Pisahkan error "setup" dari error "iterasi".
Fungsi Anda harus mengembalikan (iter.Seq[T], error). Pemanggil wajib mengecek error sebelum memulai loop.
Kesimpulan
Gunakan
pkg/itersaat Anda butuh evaluasi malas (lazy), streaming data, atau generator untuk menghemat memori.Jangan gunakan
pkg/iterjikafor...rangebiasa di slice atau map sudah cukup.Selalu cek
if !yield(...) { return }.
Last updated