Langsung ke konten

Topic archive

Go

Go, yang juga dikenal sebagai Golang, adalah bahasa pemrograman bertipe statis yang dirancang di Google dengan fokus pada kesederhanaan, kompilasi cepat, eksekusi efisien, dan concurrency yang praktis. Go banyak digunakan untuk layanan backend, tooling cloud, perangkat lunak jaringan, dan aplikasi command-line.

10 articles
Go 19 Sep 2026 7 min read

OTP Email di Go: Kode Sekali Pakai, Kedaluwarsa, dan Perlindungan Replay

OTP Email di Go: Kode Sekali Pakai, Kedaluwarsa, dan Perlindungan Replay OTP email terlihat sederhana: buat enam digit, kirimkan, lalu bandingkan dengan input pengguna. Namun, batas keamanannya bukan berada pada API email. Bagian pentingnya adalah lifecycle challenge di sisi server. Implementasi yang benar harus membuat kode sulit ditebak, membatasi masa berlakunya, membatasi tebakan, menonaktifkan challenge lama ketika diperlukan, dan memastikan kode yang sudah berhasil dipakai tidak dapat dikonsumsi untuk kedua kalinya. Properti ini berbeda dari TOTP, meskipun keduanya sering disebut OTP.

Go 16 Sep 2026 4 min read

Urutan Iterasi Map Go Tidak Stabil

range pada map Go dapat mengunjungi entri yang sama dalam urutan berbeda pada iterasi berturut-turut. Spesifikasi bahasa menyatakan bahwa urutan iterasi map tidak ditentukan dan tidak menjamin bahwa iterasi berikutnya pada map yang tidak berubah akan mengulangi urutan sebelumnya. Kontrak ini lebih kuat daripada sekadar mengatakan bahwa map tidak terurut. Container yang tidak terurut masih bisa saja menampilkan urutan stabil yang bergantung pada insertion order atau layout storage. Program Go tidak boleh memberikan makna seperti itu pada traversal map.

Go 16 Sep 2026 4 min read

Reuse Go WaitGroup Memerlukan Boundary Wait yang Sudah Selesai

sync.WaitGroup dapat digunakan kembali setelah sebuah wait phase selesai, tetapi task set independen baru tidak boleh dimulai selama call Wait dari phase sebelumnya masih aktif. Boundary-nya adalah return dari setiap Wait sebelumnya, bukan sekadar saat internal task counter mencapai nol. Constraint ini penting ketika satu instance WaitGroup dipertahankan lintas batch, epoch, request wave, atau coordination cycle berulang. Reuse didukung, tetapi phase tidak boleh overlap pada transisi counter dari nol menjadi positif.

Go 16 Sep 2026 4 min read

Go sync.Cond Wait Memeriksa Ulang Shared State

sync.Cond.Wait melanjutkan eksekusi setelah notification, tetapi notification tidak menyatakan bahwa kondisi khusus milik caller masih true ketika goroutine memperoleh lock kembali. Shared predicate tetap menjadi source of truth, sehingga waiter memeriksanya lagi setiap kali Wait kembali. Boundary ini memisahkan notification dari state. Signal dan Broadcast mengumumkan bahwa state yang relevan mungkin telah berubah; keduanya tidak memindahkan ownership state tersebut atau memesannya untuk waiter tertentu. Wait membuka lock lalu memperolehnya kembali Sebuah Cond terkait dengan Locker, umumnya *sync.Mutex. Caller memegang lock tersebut saat memeriksa shared state. Jika predicate false, Wait secara atomik membuka locker dan menangguhkan caller. Sebelum Wait kembali, ia mengunci locker lagi.

Go 16 Sep 2026 5 min read

Go singleflight Hanya Membagikan Hasil yang Sedang In-Flight

singleflight.Group menekan eksekusi function duplikat hanya selama operasi dengan key yang sama masih in-flight. Caller concurrent dapat menerima satu hasil bersama, tetapi caller yang datang setelah completion akan memulai eksekusi baru. Karena itu group adalah mekanisme request coalescing, bukan result cache. Boundary ini memengaruhi cache fill, metadata refresh, backend read, dan operasi berbasis key lain yang dapat menerima burst pekerjaan concurrent identik. Group dapat mengurangi tekanan simultan pada backing operation tanpa memperpanjang lifetime value yang dikembalikan.

Go 16 Sep 2026 5 min read

Go errgroup SetLimit Memblokir Submitter saat Batas Concurrency Tercapai

errgroup.Group.SetLimit dapat memblokir goroutine yang memanggil Group.Go. Limit diterapkan sebelum worker goroutine baru dimulai, sehingga group yang penuh menerapkan backpressure pada saat task submission alih-alih membangun internal queue. Perilaku ini penting ketika submission merupakan bagian dari control path lain. Loop yang tampak meluncurkan pekerjaan secara asynchronous dapat berhenti di g.Go(...) sampai salah satu active function selesai. Limit berada pada admission Zero-value errgroup.Group tidak memiliki concurrency limit. Setelah SetLimit(n), paling banyak n function yang dimulai oleh Go aktif secara bersamaan. Negative limit mengembalikan unlimited admission, sedangkan zero limit mencegah setiap pemanggilan Go berikutnya memulai function.

Go 16 Sep 2026 4 min read

Go Defer Menyimpan Argumen Pemanggilan Sebelum Return

Statement defer pada Go mengevaluasi nilai fungsi dan parameter pemanggilannya ketika eksekusi mencapai statement tersebut, meskipun fungsi yang ditunda baru berjalan saat fungsi di sekitarnya melakukan return. Mutasi di antara dua momen itu tidak mengubah secara retroaktif nilai argumen yang sudah disimpan. Pemisahan antara evaluasi dan invocation ini merupakan bagian dari semantik bahasa, bukan detail optimisasi. Setiap defer yang dieksekusi mencatat sebuah pemanggilan dengan nilai yang ditetapkan pada saat itu. Proses return kemudian menjalankan pemanggilan yang tercatat dalam urutan registrasi terbalik.

Go 13 Sep 2026 4 min read

Filter Slice Secara In-Place dengan slices.DeleteFunc di Go

Memfilter slice Go sering dimulai dengan loop kecil yang mempertahankan elemen tertentu dan membuang sisanya. slices.DeleteFunc menyatakan operasi kebalikannya secara langsung: predicate menandai elemen yang akan dihapus, elemen yang dipertahankan tetap dalam urutan semula, dan backing array yang ada digunakan kembali. Properti terakhir itu penting. DeleteFunc bukan filter yang menyalin data. Fungsi ini memutasi storage slice yang diberikan dan mengembalikan slice header dengan panjang hasil. Predicate memilih elemen yang akan dihapus Fungsi ini menerima slice dan deletion predicate:

Go 11 Sep 2026 7 min read

Urutkan Nilai Iterator Secara Stabil di Go dengan slices.SortedStableFunc

Sebuah iterator dapat menghasilkan nilai dalam urutan yang sudah memiliki arti: urutan kedatangan, urutan file, urutan database, atau urutan yang dibentuk oleh tahap pipeline sebelumnya. Jika Anda perlu mengurutkan nilai tersebut berdasarkan satu key tanpa mengacak kelompok dengan key yang sama, slices.SortedStableFunc menangani kedua langkah itu sekaligus. Fungsi ini mengonsumsi sebuah iter.Seq, mengumpulkan nilai yang dihasilkan ke slice baru, lalu mengurutkan slice tersebut dengan comparator. Ketika comparator mengembalikan nol, nilai-nilai itu mempertahankan urutan relatif yang sama seperti di sequence.

Go 10 Sep 2026 5 min read

Tambahkan Nilai Iterator ke Slice Go dengan slices.AppendSeq

Iterator praktis saat data mengalir melalui pipeline, tetapi pada akhirnya Anda mungkin perlu menyimpan nilai-nilai tersebut dalam sebuah slice. Jika sudah memiliki slice tujuan, mengumpulkan iterator secara terpisah lalu menambahkannya hanya menciptakan langkah perantara yang tidak perlu. Go 1.23 menambahkan slices.AppendSeq tepat untuk batas ini. Fungsi tersebut mengonsumsi sebuah iter.Seq, menambahkan setiap nilai yang dihasilkan ke slice yang sudah ada, lalu mengembalikan slice hasilnya. Apa yang dilakukan slices.AppendSeq Fungsi ini memiliki signature yang ringkas: